保存用于会话认证的OAuth2访问令牌
问题描述:
我设置了使用OAuth2密码授权认证的无会话应用。当用户使用用户名和密码登录我的应用程序时,我在sessionStorage中保存访问令牌,有效期为30分钟。我还会在sessionStorage中保存刷新令牌,以防我需要延长会话超过30分钟。刷新令牌有效期为30天。保存用于会话认证的OAuth2访问令牌
如果在登录时选择了“记住我”复选框,我将保存访问和刷新标记保存在localStorage中,以便只要刷新标记有效,它们就会保留。
这两个似乎工作除了几个问题罚款:
- 如果浏览器是开放的,并且用户不会退出会话可能持续30天。
- sessionsStorage不会在窗口/选项卡之间持续存在,所以如果用户打开新窗口,则需要重新登录。当选择'记住我'复选框时,这不是问题,因为localStorage确实在窗口之间存在。
答
我认为使用刷新标记对JavaScript应用程序不安全 - 您需要访问/token
端点并使用应用程序的秘密进行身份验证。但秘密在这些应用程序中公开。
我更喜欢OAuth2隐式流,并从/auth
端点获取新标记,prompt=none
参数(来自OpenID Connect)。但是,对于隐式流程,您需要获得更长的生命ID令牌(并在稍后请求带有ID令牌的访问令牌),或者在OAuth2上实现“记住我”(更好的选项 - 可以由任何应用)。这也可以通过在标签之间传递令牌来解决问题2。
- “会话”是指使用刷新令牌在30天内生成访问令牌?如果这是一个问题,你可以实现一些活动检测器,如果用户没有活动,它可以将用户注销。 30分钟。
- 可以使用
localStorage
作为一种消息传递服务,因此您可以将令牌保留在sessionStorage
中,但新标签可以使用localStorage
从现有选项卡请求令牌。欲了解更多信息请参阅http://www.codediesel.com/javascript/sharing-messages-and-data-across-windows-using-localstorage/
代码示例:
function eventListener(e) {
if (e.key == 'storage-event') {
output.innerHTML = e.newValue;
}
}
function triggerEvent() {
localStorage.setItem('storage-event', this.value);
}
window.addEventListener("storage", eventListener, true);
data.addEventListener("keyup", triggerEvent, true);
的工作流程是这样的:
- 新标签打开,写入任意值到localStorage的用一个表示它需要令牌的密钥。密钥可以是“newTabOpened”。新选项卡开始监听另一个键“oauth2token”的更改。
- 现有标签监听“newTabOpened”键的变化,并将其标记值写入“oauth2token”键下。
- 新选项卡读取令牌并将其从localStorage中删除。
我曾考虑过使用localStorage在窗口之间传递令牌,但这可能会导致无意中在localStorage中留下访问/刷新标记。 – Pardoner
新标签可以在读取它们后从“localStorage”中删除标记。 –
没错,但问题是你必须将它们放在localStorage中,以期打开新标签。但如果一个新标签从未打开,那么他们就会坐下。 – Pardoner