OAuth2 资源服务器在与授权服务器通信时应该使用 Basic 还是 Bearer token auth?

Posted

技术标签:

【中文标题】OAuth2 资源服务器在与授权服务器通信时应该使用 Basic 还是 Bearer token auth?【英文标题】:Should OAuth2 resource servers use Basic or Bearer token auth when communicating with the authorization server? 【发布时间】:2019-09-25 14:41:17 【问题描述】:

给定单独的 spring-security-oauth2 授权和资源服务器:

我希望授权服务器的/oauth/check_token 端点在Authorization 标头中接受来自资源服务器的承载令牌,但它只接受Basic 身份验证。注意:我指的是请求授权令牌,而不是要检查的令牌。

我认为 OAuth2AuthenticationProcessingFilter 负责提取和验证 Authorization: Bearer ...,但根据 javadoc,它似乎仅被资源服务器用于验证来自用户或其他客户端的请求。

在与授权服务器通信时,资源服务器是否应该始终提供Basic auth?最佳做法是什么?如果Bearer 令牌可以接受,授权服务器是否需要通过@EnableResourceServer 配置为资源服务器才能获得此功能?

【问题讨论】:

【参考方案1】:

CheckTokenEndpoint 的 Javadoc 注释:

控制器为不能这样做(或使用不透明令牌值)的客户端解码访问令牌。

由于客户端使用 Basic auth 向授权服务器进行身份验证以授予访问权限,因此 /oauth/check_token 端点也需要 Basic auth 是有意义的。

通常,资源服务器接收到的令牌是自编码的(或由令牌存储支持),因此它不需要通过直接与授权服务器通信来检查令牌。 资源服务器和授权服务器之间不需要通信

如果它确实需要与授权服务器交互,如果您使用的是 JWT,则可能是获取其公钥。但是保护这个端点并没有真正的用处,因为它是一个公钥是有原因的。同样,这会在资源服务器启动时发生,而且肯定不会针对它收到的每个令牌。

【讨论】:

我们正在使用 JWT。但是,我们希望客户端能够检查某些关键端点的令牌是否已被撤销(我知道这是非标准的),并且此验证与身份验证服务器的 /check_token 端点相关联。 关于客户端通过基本身份验证向身份验证服务器进行身份验证的第一点,您的意思是除了基本身份验证之外不需要使用任何其他东西,因为无论如何他们都需要在第一次获得令牌? ...并且 OAuth 的目的是保护凭据不通过非身份验证服务器,这在这种情况下无关紧要,因为客户端直接与它通信? 是的;客户端通过授权服务器进行身份验证以生成令牌。如果资源服务器想要检查令牌的有效性,它将访问授权服务器更新的数据库,而不是直接与授权服务器交互。如果没有,请让客户端直接使用身份验证服务器验证令牌。

以上是关于OAuth2 资源服务器在与授权服务器通信时应该使用 Basic 还是 Bearer token auth?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2之介绍及授权方式

OAuth2.0笔记

使用OAuth2实现授权服务

使用OAuth2实现授权服务

Oauth2:资源服务器应该如何知道访问令牌是不是有效?

OAuth2.0 授权方式及步骤梳理总结