You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:10:11