为何Spring Authorization Server将client_id作为访问令牌的受众?
关于OAuth2访问令牌受众(audience)的疑问解答
你完全没说错——访问令牌的受众(audience)确实应该是资源服务器,代码里这么写通常是这几种情况:
- 单一资源服务器场景:如果系统里只有一个资源服务器,且客户端只能访问它,有些团队会图省事直接用客户端ID当audience,这种做法在单一环境下能跑通,但不是标准操作。
- 框架默认行为:Spring Security OAuth2的
JwtGenerator默认逻辑可能会把客户端ID填充到audience字段,但这并不是OAuth2的最佳实践。 - 未正确配置资源服务器标识:正常来说,你应该手动指定资源服务器的专属标识符作为audience,比如:
claimsBuilder .subject(context.getPrincipal().getName()) .audience(Collections.singletonList("https://your-resource-server.com/api")) .issuedAt(issuedAt) .expiresAt(expiresAt); - 特殊授权模式例外:如果是客户端凭证授权模式,偶尔会出现令牌受众包含客户端自身的情况,但这是小众场景,授权码/密码模式这类常用场景下,受众必须指向资源服务器。
另外要注意,资源服务器验证令牌时会校验audience是否匹配自身标识,如果代码里设成客户端ID,那资源服务器的配置也得跟着改成校验客户端ID,这就偏离了OAuth2的设计初衷——访问令牌是发给资源服务器的,受众自然要明确指向它。
所以正确的做法是根据资源服务器的实际标识来设置audience,而不是用客户端ID。
内容的提问来源于stack exchange,提问作者user3790053
相关产品推荐
相关产品推荐

