AngularJS 使用 ui-路由器版本 1.x 在状态转换中滑动过期的令牌认证

AngularJS token authentication with sliding expiration in state transitions with ui-router version 1.x

在我们的应用程序中,我们有一个要求,即用户应该登录一定的时间,这可以由系统管理员配置,比如 10 分钟。我们还有另一个要求,当用户导航到应用程序的不同部分时,这个时间应该被刷新并设置回配置的数量。

我们的应用程序是用 AngularJS 编写的,我们使用 ui-router 进行路由,因此当用户在不同状态之间导航时,注销时间会更新。

后台是.NET写的,我们用jwt token做认证,Token有个字段叫expiration。在每个请求的开始,我们检查令牌是否未过期。

我有一个问题,我不知道如何告诉服务器它应该更新令牌过期时间,我使用的是 ui-router 版本 1,它有一些钩子可以用来做服务器端的事情状态转换,我最终得到了这样的结果:

  $transitions.onBefore({
      to: "*"
  }, function(trans) {      
     // update the client ui, and also tell the server to update
     // the timeout in the serverside and database

     return authService.refreshToken();
  });

但我不确定这种方法是否正确,我在REST架构中找不到很好的解决方案,如果你能告诉我这种方法或观点的优缺点,我将不胜感激我到正确的实现

理论

据我所知,JWT 标准并没有真正说明刷新。 (https://tools.ietf.org/rfc/rfc7519.txt)

如果我很理解您的问题,您希望某人的令牌在 X 分钟不活动后自动更新。我想你想要的这种方法是 sliding sessions.

你可以在那里看到一篇关于它的好文章:https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/

这种情况下的最佳做法不是延长令牌的寿命,而是申请一个新令牌。你会发现很多文章和约定都在谈论它。出于安全考虑,越短越安全。

即使它是为 oauth 编写的,这里也有一篇非常好的文章,列出了令牌管理的不同方式: https://www.oauth.com/oauth2-servers/access-tokens/access-token-lifetime/


用例

在您的 API 中,我会提供一个 refreshToken,允许通过 HTTP request.

更新令牌

在你 Front 中,我会制作一个存储最后转换日期的服务,比方说 lastTransitionDate = new DateTime()。它还将存储 tokenrefreshTokenexpiration date of the token.

现在当你有一个过渡时,

  1. 您检查令牌是否仍然有效(例如通过发送 checkToken 请求)
  2. 如果令牌不再有效并且 lastTransitionDate 超过 X 分钟前,您将强制注销。
  3. 如果令牌不再有效但 lastTransitionDate 少于 X 分钟,则您通过发送 refreshToken.
  4. 请求新令牌
  5. 完成所有检查后您重置 lastTransitionDate

您唯一需要确定的是,X 足以确保用户不会断开连接,如果他只是花了一些时间阅读页面上的一些内容而没有触发过渡。

好吧,您不能简单地刷新令牌的到期时间而不更改它。这是因为到期时间是在令牌本身中编码的。所以,当你想改变令牌的有效期时,你需要改变令牌本身。

具体到您的情况,如果您想刷新用户的超时阈值,服务器将必须为每个请求创建一个新令牌并将其发回作为响应(可能使用 headers)。 UI 必须在请求完成后将此令牌存储在存储中。

这样,UI 将始终有最新的 JWT 可用。而且,您不必像 authService.refreshToken() 这样的调用,因为服务器会自动处理它,这是一种低效的方法。

此外,如果用户在一段时间内(比如 10 分钟)不活动,然后向服务器发出请求,从 UI 发送的 JWT 已经过期,服务器可以向 UI 使 session.

过期