关于Client Credentials Grant令牌区分及授权使用的技术问询
问题背景
我在Microsoft Entra ID中拥有一个应用注册,该注册包含两个客户端密钥。我希望通过两个独立的Python脚本(script1和script2),使用client credentials授权类型从该应用注册获取访问令牌。但问题是,无法区分JWT令牌是来自script1还是script2,且每个脚本使用的是不同的客户端密钥。我使用以下curl命令获取JWT访问令牌,指定使用client credentials授权类型,并尝试使用不同的client_secret,但得到的JWT完全一致,无法区分。
curl --location 'https://login.microsoftonline.com/5fdbbf9b-ae6b-4986-8349-46baf9cffc1a/oauth2/v2.0/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Cookie: fpc=AsBGgX8tBlFBpcISkM-uVZHIlH0WAQAAANI0F94OAAAA' \ --data-urlencode 'client_id=4c670161-3e27-441f-b694-6538e755d94e' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'client_secret=xxxxxxxxxxxxxxxxxxxx' \ --data-urlencode 'scope=api://4c670161-3e27-441f-b694-6538e755d94e/.default'
提问
- 问题1:当使用client credentials授权类型的客户端使用不同密钥时,是否有办法区分它们?
- 问题2:我是否错误使用了该授权类型?该类型是机器对机器场景的推荐类型。
回答
针对问题1
默认情况下,同一应用注册的不同客户端密钥生成的client credentials令牌不会携带密钥标识,无法直接从JWT本身区分来源。但可以通过以下方式实现区分:
- 配置自定义令牌声明:在Entra ID的应用注册中,通过应用清单或自定义策略添加自定义声明,为不同脚本的请求注入唯一标识字段,让API端能通过令牌内的声明区分来源。
- 拆分应用注册:为每个脚本创建独立的应用注册,而非共用同一应用的不同密钥。此时每个脚本的
client_id不同,JWT中的azp(授权方)字段会对应不同的client_id,直接可区分来源。 - API侧配合传递额外标识:如果API由你开发,可在调用API时除令牌外额外传递
script-id这类参数,用来区分不同脚本的请求,不过这种方式依赖API的支持,并非从令牌本身区分。
针对问题2
你没有错误使用client credentials授权类型。该类型确实是机器对机器(M2M)场景的标准推荐方案,适用于无用户参与的服务间调用场景。你遇到的令牌无法区分的问题,是同一应用注册下多密钥使用时的默认行为,不属于使用方式错误。
内容的提问来源于stack exchange,提问作者Efim Efim
相关产品推荐
相关产品推荐

