使用OAuth2保护REST Web服务:一般原则

时间:2014-12-22 15:51:27

标签: java rest spring-security oauth-2.0

我们正在使用Spring安全性和OAuth2在Java中构建RESTful Web应用程序。

一切都按预期工作,我开始理解访问和刷新令牌的基本知识,但仍有一些缺点,通过浏览互联网,我对不同的观点更加困惑。

我们的实施方式现在正在运作:

在spring-security中,我们一次只能为给定用户提供1个有效的刷新令牌。 我们有刷新令牌的有效期为300秒(5分钟)。 每次我们为用户请求新的刷新令牌时,都会返回相同的刷新令牌,但不会重置有效时间。

这样,每302秒在后台询问一个新的刷新令牌,这个刷新令牌用于请求放入REST调用的授权头中的访问令牌。

大部分时间都可以正常工作,但是如果请求在300秒和302秒之间执行,其中第一个刷新令牌已过期而第二个尚未返回,则会出现身份验证错误并且用户已注销应用

我在互联网上阅读了很多不同的建议:

  • 第一个是为每个Web服务调用请求一个新的刷新令牌。这个我们没有考虑,因为我们必须提供凭证(用户名/密码)来获取每个WS请求的刷新令牌。

  • 第二个是将刷新令牌的有效期增加到10小时(而不是5分钟)。对于大多数情况,这将解决或问题。但是,在刷新令牌的到期时间之后以及新用户注册之前,用户仍有机会注销。

解决此问题的最佳方法是什么?有效期是10小时安全吗?是否建议为每个ws调用使用新的刷新令牌?

1 个答案:

答案 0 :(得分:1)

我认为为每次通话创建新的刷新令牌并不是一个好习惯。刷新令牌的整个要点是在到期时获取新的访问令牌。因此,当您获得身份验证错误(假设为401)时,您知道访问令牌已过期或者它已无效,那么您应该尝试使用刷新令牌刷新它以获取新的访问令牌。如果访问令牌刷新不起作用,则应该注销用户。在每个刷新的访问令牌响应中,您可以分配新的刷新令牌,因此只要用户具有有效的刷新令牌,他/她就可以在到期时获得新的访问令牌。