【发布时间】:2018-02-18 12:54:57
【问题描述】:
如果用户仍在向系统 API/服务器发出请求,我如何确保用户访问令牌不会过期?
是否可以根据用户向服务器发出的每个请求刷新JWT 的到期日期?
【问题讨论】:
标签: api jwt access-token
如果用户仍在向系统 API/服务器发出请求,我如何确保用户访问令牌不会过期?
是否可以根据用户向服务器发出的每个请求刷新JWT 的到期日期?
【问题讨论】:
标签: api jwt access-token
OAuth2 使用包含用户数据的短期 access token 和用于询问的长期 refresh token获取新的访问令牌。
只是指出您只能在服务器端更改 JWT 的数据(或更准确地说是创建一个新的)。即使其数据可公开访问,其签名也是基于其内容。所以如果它的内容被修改了,就得用私钥重新签名,否则就失效了。 它的目的不是隐藏数据(JWE/JWS 除外),而是确保接收它的服务器以及任何客户端请求是真实的(由服务器创建,这要归功于它的私钥,或者由第三方认证服务)。 (对不起,如果你已经很清楚了)
如果您要实现一些特定且有限的安全性,并且想要一些简单的东西,您可以在服务器端保留一些关于令牌过期的信息(例如在数据库表中),并发送一个新的信息以及响应如果您检测到它即将过期(并且如果 Authorization 标头的令牌正常)。
否则,您可以实施一些客户端轮询,定期请求新令牌(或者更好,但更复杂的服务器推送)。
我还研究了一个实现失败并重试的解决方案:如果令牌被服务器拒绝(5 分钟后),客户端会联系身份验证服务(该服务具有所提供令牌的注册表,带有更长的过期时间),这提供了一个新的令牌。之后,客户端重试了请求。
我还研究了一个实现,正如您所建议的,每个响应都会发送新的令牌......有点。我们还将令牌列表保存在注册表中,只是为了确保对于收到的令牌只会发送一个新令牌(以确保该系统不会增加授权令牌)。收到后,先前的令牌被禁用(但有一个宽限期:它们仍然有效一分钟,以确保并行调用能够到达服务器),同时提供一个新的令牌。该系统还确保同一用户不能同时在不同设备上使用该应用程序(令牌的范围是每个用户,任何以前的用户令牌都被删除)。 请注意,使用这样的系统,开发、调试、重放请求变得很痛苦......
不是安全专家,我不能保证我的回答是万无一失的。也许你很快就会得到更好的 cmets。
有一些常见的安全模式,例如 OAuth,您可以在其中找到有关 OWASP 的信息、安全专家圣经以及对您有很大帮助的第三方解决方案,例如 Auth0(看看他们的文章,它们是金矿),但软件/安全架构师永远不会错过设计自己的自定义安全实施的机会(......并重新发明轮子)。
【讨论】: