如何识别访问令牌是通过客户端凭证流还是授权码流生成的?
如何区分访问令牌的生成流(客户端凭证流 vs 授权码流)
一、标准化识别方式(基于JWT声明)
如果访问令牌是JWT格式,OAuth 2.0和OIDC规范定义了一些核心声明可用于区分:
sub声明:授权码流生成的令牌(关联用户身份)必然包含sub(用户唯一标识符);客户端凭证流的令牌仅代表客户端身份,不会携带sub字段。grant_type声明:部分授权服务器会在JWT中直接包含grant_type字段,明确标注令牌是通过authorization_code还是client_credentials生成的。scope声明:授权码流的scope通常包含用户相关权限(如openid、profile、email);客户端凭证流的scope一般是客户端级别的、不关联用户的权限(如service.api.read)。azp/client_id声明:两者都会携带客户端标识,但授权码流的azp(授权方)会伴随用户相关声明;客户端凭证流则只有客户端相关标识,无用户字段。
二、非JWT令牌或事前未知场景的最佳实践
如果令牌是不透明(Opaque)格式,或无法直接解析JWT,可通过以下方式判断:
- 调用令牌 introspection 端点:绝大多数合规的OAuth 2.0授权服务器都提供令牌 introspection API,传入令牌后会返回元数据,其中通常包含
grant_type字段(直接告知生成流类型),以及sub、username等字段判断是否关联用户。 - 查询授权服务器审计日志:如果是你管控的授权服务器,可查看令牌生成时的审计日志,日志中会记录生成令牌所使用的授权类型、客户端信息及(如果是授权码流)用户信息。
- 分析令牌受众(
aud):部分系统中,客户端凭证流的令牌受众是面向服务间通信的API,而授权码流的令牌受众会包含用户相关的业务服务——不过这取决于具体配置,仅作为辅助判断依据。 - 参考令牌有效期:经验上,客户端凭证流的令牌有效期通常更长(因为客户端是可信实体,无需频繁刷新);授权码流的令牌有效期较短,配合刷新令牌使用——这是经验法则,并非标准规定。
注意事项
- 并非所有授权服务器都会在JWT中包含
grant_type声明,所以sub字段是最可靠的区分依据之一。 - 对于不透明令牌,令牌 introspection 是唯一能准确获取生成流信息的标准化方式,因为这类令牌本身不携带任何可解析的元数据。
内容的提问来源于stack exchange,提问作者Stefan Rusen
相关产品推荐
相关产品推荐

