我设置了一个使用OAuth2密码授予身份验证的无会话应用。当用户使用用户名和密码登录我的应用程序时,我将访问令牌保存在sessionStorage中,该令牌有效30分钟。我还在sessionStorage中保存了一个刷新令牌,以防我需要延长会话时间超过30分钟。刷新令牌有效期为30天。
如果'记住我'登录时选中了复选框我在localStorage中保存了访问权限并刷新了令牌,因此只要刷新令牌有效,它们就会一直存在。
除了几个问题:
之外,其他两种似乎都能正常工作答案 0 :(得分:1)
我认为使用刷新令牌对JavaScript应用程序来说并不安全 - 您需要访问/token
端点并使用应用程序的秘密进行身份验证。但这个秘密在这些应用程序中公之于众。
我更喜欢OAuth2隐式流,并使用/auth
参数(来自OpenID Connect)从prompt=none
端点获取新令牌。但是使用隐式流程,您可能需要获得更长的生活ID令牌(并在以后请求带有ID令牌的访问令牌)或者在OAuth2上实现“记住我”(更好的选择 - 任何人都可以使用)应用)。这也可以解决问题#2,在标签之间传递令牌。
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);
工作流程如下: