保存OAuth2访问令牌以进行无会话身份验证

时间:2017-04-26 19:43:21

标签: javascript session oauth oauth-2.0

我设置了一个使用OAuth2密码授予身份验证的无会话应用。当用户使用用户名和密码登录我的应用程序时,我将访问令牌保存在sessionStorage中,该令牌有效30分钟。我还在sessionStorage中保存了一个刷新令牌,以防我需要延长会话时间超过30分钟。刷新令牌有效期为30天。

如果'记住我'登录时选中了复选框我在localStorage中保存了访问权限并刷新了令牌,因此只要刷新令牌有效,它们就会一直存在。

除了几个问题

之外,其他两种似乎都能正常工作
  1. 如果浏览器处于打开状态且用户未注销,则会话可能会持续30天。
  2. sessionsStorage不会在Windows /标签之间保留,因此如果用户打开新窗口,则需要再次登录。当“记住我”时,这不是问题。复选框已选中,因为localStorage在Windows之间保持不变。

1 个答案:

答案 0 :(得分:1)

我认为使用刷新令牌对JavaScript应用程序来说并不安全 - 您需要访问/token端点并使用应用程序的秘密进行身份验证。但这个秘密在这些应用程序中公之于众。

我更喜欢OAuth2隐式流,并使用/auth参数(来自OpenID Connect)从prompt=none端点获取新令牌。但是使用隐式流程,您可能需要获得更长的生活ID令牌(并在以后请求带有ID令牌的访问令牌)或者在OAuth2上实现“记住我”(更好的选择 - 任何人都可以使用)应用)。这也可以解决问题#2,在标签之间传递令牌。

  1. “会话”是指使用刷新令牌生成30天的访问令牌?如果这是一个问题,你可以实现一些活动检测器,如果没有活动,可以将用户注销。 30分钟。
  2. 可以使用localStorage作为一种消息传递服务,因此您可以将令牌保留在sessionStorage中,但新标签可以使用localStorage来请求来自现有标签的令牌。有关详细信息,请参阅http://www.codediesel.com/javascript/sharing-messages-and-data-across-windows-using-localstorage/
  3. 链接文章中的代码示例:

    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);
    

    工作流程如下:

    1. 打开新选项卡,并使用指示需要令牌的键将任意值写入localStorage。关键可以是“newTabOpened”。新标签开始侦听另一个键“oauth2token”的更改。
    2. 现有标签监听“newTabOpened”键的更改,作为反应,它将其标记值写在“oauth2token”键下。
    3. 新标签会读取令牌并将其从localStorage中删除。