【发布时间】:2015-02-20 17:55:31
【问题描述】:
我们正在使用 Spring 安全性和 OAuth2 在 Java 中构建一个 RESTful Web 应用程序。
一切都按预期工作,我开始了解访问和刷新令牌的基础知识,但仍有一些不明确之处,通过浏览互联网,我对不同的观点更加困惑。
我们现在的实现方式:
在 spring-security 中,我们一次只能为给定用户拥有 1 个有效的刷新令牌。 刷新令牌的有效期为 300 秒(5 分钟)。 每次我们为用户请求一个新的刷新令牌时,都会返回相同的刷新令牌,但不会重置有效期。
这样,每 302 秒在后台询问一个新的刷新令牌,并且此刷新令牌用于请求放入 REST 调用的授权标头中的访问令牌。
这在大多数情况下都可以正常工作,但如果在第一个刷新令牌已过期且第二个尚未返回的 300 到 302 秒之间执行请求,我们会收到身份验证错误,并且用户会退出应用。
我在互联网上阅读了很多不同的建议:
第一个是为每个 Web 服务调用请求一个新的刷新令牌。我们没有考虑这一点,因为我们必须提供凭据(用户名/密码)来获取每个 WS 请求的刷新令牌。
第二个是将刷新令牌的有效期增加到10小时(而不是5分钟)。这将解决大多数情况下的问题。但是用户仍有可能在刷新令牌到期后和新令牌之前注销。
解决此问题的最佳方法是什么。 10小时的有效期安全吗?是否建议为每个 ws 调用使用新的刷新令牌?
【问题讨论】:
-
每次调用都获取一个刷新令牌是没有意义的,刷新令牌的重点就是避免这种情况。刷新令牌的寿命通常更长(即几天或仅按需过期)。我认为解决方案是在获取新令牌之前以某种方式阻止客户端应用程序中的其他线程。
标签: java rest spring-security oauth-2.0