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

Posted

技术标签:

【中文标题】使用 OAuth2 保护 REST Web 服务:一般原则【英文标题】:Protecting REST web services using OAuth2: General principles 【发布时间】: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 调用使用新的刷新令牌?

【问题讨论】:

每次调用都获取一个刷新令牌是没有意义的,刷新令牌的重点就是避免这种情况。刷新令牌的寿命通常更长(即几天或仅按需过期)。我认为解决方案是在获取新令牌之前以某种方式阻止客户端应用程序中的其他线程。 【参考方案1】:

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

【讨论】:

以上是关于使用 OAuth2 保护 REST Web 服务:一般原则的主要内容,如果未能解决你的问题,请参考以下文章

Spring security oauth2:在 REST Web 服务中获取用户名

使用 OAuth2.0 或 Azure Active Directory 保护 REST API

如何在使用 OAuth2 社交登录保护 REST API 的同时配置 Spring Boot 登录页面

使用 oAuth 2.0 保护基于 Jersey 的 REST 服务

需要使用 Keycloak 和 oAuth2 保护普通 Spring REST API 的示例

需要使用Keycloack和oAuth2保护普通Spring REST API的示例