身份验证-使用令牌处理会话的正确方法

时间:2019-01-21 19:35:11

标签: authentication oauth-2.0 access-token openid-connect refresh-token

我有一个ReactJS SPA应用程序,该应用程序连接到ASP.NET Core WebAPI。借助OpenIddict,该API还是一个授权服务器。我正在使用 PasswordFlow RefreshTokenFlow 来处理身份验证,这意味着服务器返回了AccessToken和可选的RefreshToken。目前,我难以正确处理记住我功能。当用户想要记住时,没什么大不了的-服务器返回AccessToken,客户端存储的RefreshToken则是LocalStorage,因此当用户需要记住时,可以刷新AccessToken它即将到期或通过使用RefreshToken而到期,这很好-网络上有很多文章和其他有用的资源。当用户不想被记住时,问题就来了。这种情况下如何处理身份验证?我看到的两个解决方案是:

  • 服务器仅发布AccessToken,客户端将其存储在SessionStorage中。如果过期,客户端将强制用户重新输入其凭据以获取新的AccessTokenAccessTokens应该是短命的(根据我到目前为止所学到的信息,它可以从一个小时到几个小时不等,但是有效时间越长,在得到这种情况时安全性就越差如果它持续了一个小时,但在那之后用户仍在使用该应用程序,强迫他/她再次登录似乎有点奇怪。
  • 服务器返回AccessTokenRefreshToken,客户端将其存储在SessionStorage中。在会话期间,如果AccessToken即将过期,则客户端可以使用RefreshToken获取新的。这是有风险的,并且服务器永远不会知道用户已关闭浏览器并且应该撤销他/她的RefreshToken。假设RefreshTokens的寿命更长,这似乎确实有风险。

对于该主题的任何想法,建议和见解,我将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:1)

如果您是新手,则很难理解这些内容,但是大多数实现都是这样的:

  • SPA通过第三方库使用Open Id Connect Implicit Flow
  • 用户从SPA重定向到第三方授权服务器以登录
  • 登录过程已完全从您的应用外部化
  • 登录后,授权服务器将令牌返回到您的SPA
  • SPA用访问令牌调用API

希望这可以帮助您了解事物的总体形状。

加里

PS。如果有帮助,我有一个Code Sample和一些Written Guidance,您可能会觉得有用。

更多帖子描述了SPA的静默令牌更新如何工作,正如约翰在上面指出的那样,SPA不使用刷新令牌。