2017-04-26 99 views
1

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

如果在登录时选择了“记住我”复选框,我将保存访问和刷新标记保存在localStorage中,以便只要刷新标记有效,它们就会保留。

这两个似乎工作除了几个问题罚款:

  1. 如果浏览器是开放的,并且用户不会退出会话可能持续30天。
  2. sessionsStorage不会在窗口/选项卡之间持续存在,所以如果用户打开新窗口,则需要重新登录。当选择'记住我'复选框时,这不是问题,因为localStorage确实在窗口之间存在。

回答

1

我认为使用刷新标记对JavaScript应用程序不安全 - 您需要访问/token端点并使用应用程序的秘密进行身份验证。但秘密在这些应用程序中公开。

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

  1. “会话”是指使用刷新令牌在30天内生成访问令牌?如果这是一个问题,你可以实现一些活动检测器,如果用户没有活动,它可以将用户注销。 30分钟。
  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); 

的工作流程是这样的:

  1. 新标签打开,写入任意值到localStorage的用一个表示它需要令牌的密钥。密钥可以是“newTabOpened”。新选项卡开始监听另一个键“oauth2token”的更改。
  2. 现有标签监听“newTabOpened”键的变化,并将其标记值写入“oauth2token”键下。
  3. 新选项卡读取令牌并将其从localStorage中删除。
+0

我曾考虑过使用localStorage在窗口之间传递令牌,但这可能会导致无意中在localStorage中留下访问/刷新标记。 – Pardoner

+0

新标签可以在读取它们后从“localStorage”中删除标记。 –

+0

没错,但问题是你必须将它们放在localStorage中,以期打开新标签。但如果一个新标签从未打开,那么他们就会坐下。 – Pardoner