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()
。它还将存储 token
、refreshToken
和 expiration date of the token
.
现在当你有一个过渡时,
- 您检查令牌是否仍然有效(例如通过发送
checkToken
请求)
- 如果令牌不再有效并且
lastTransitionDate
超过 X 分钟前,您将强制注销。
- 如果令牌不再有效但
lastTransitionDate
少于 X 分钟,则您通过发送 refreshToken
. 请求新令牌
- 完成所有检查后您重置
lastTransitionDate
。
您唯一需要确定的是,X
足以确保用户不会断开连接,如果他只是花了一些时间阅读页面上的一些内容而没有触发过渡。
好吧,您不能简单地刷新令牌的到期时间而不更改它。这是因为到期时间是在令牌本身中编码的。所以,当你想改变令牌的有效期时,你需要改变令牌本身。
具体到您的情况,如果您想刷新用户的超时阈值,服务器将必须为每个请求创建一个新令牌并将其发回作为响应(可能使用 headers)。 UI 必须在请求完成后将此令牌存储在存储中。
这样,UI 将始终有最新的 JWT 可用。而且,您不必像 authService.refreshToken()
这样的调用,因为服务器会自动处理它,这是一种低效的方法。
此外,如果用户在一段时间内(比如 10 分钟)不活动,然后向服务器发出请求,从 UI 发送的 JWT 已经过期,服务器可以向 UI 使 session.
过期
在我们的应用程序中,我们有一个要求,即用户应该登录一定的时间,这可以由系统管理员配置,比如 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()
。它还将存储 token
、refreshToken
和 expiration date of the token
.
现在当你有一个过渡时,
- 您检查令牌是否仍然有效(例如通过发送
checkToken
请求) - 如果令牌不再有效并且
lastTransitionDate
超过 X 分钟前,您将强制注销。 - 如果令牌不再有效但
lastTransitionDate
少于 X 分钟,则您通过发送refreshToken
. 请求新令牌
- 完成所有检查后您重置
lastTransitionDate
。
您唯一需要确定的是,X
足以确保用户不会断开连接,如果他只是花了一些时间阅读页面上的一些内容而没有触发过渡。
好吧,您不能简单地刷新令牌的到期时间而不更改它。这是因为到期时间是在令牌本身中编码的。所以,当你想改变令牌的有效期时,你需要改变令牌本身。
具体到您的情况,如果您想刷新用户的超时阈值,服务器将必须为每个请求创建一个新令牌并将其发回作为响应(可能使用 headers)。 UI 必须在请求完成后将此令牌存储在存储中。
这样,UI 将始终有最新的 JWT 可用。而且,您不必像 authService.refreshToken()
这样的调用,因为服务器会自动处理它,这是一种低效的方法。
此外,如果用户在一段时间内(比如 10 分钟)不活动,然后向服务器发出请求,从 UI 发送的 JWT 已经过期,服务器可以向 UI 使 session.
过期