B2C客户端凭证流令牌缺失roles/scp声明及授权码流示例求助
问题分析与解决方案
一、client_credentials流的核心问题
你遇到的roles/scp声明缺失、openid/offline_access权限不生效,本质是流类型与权限类型不匹配:
openid和offline_access是委派权限,依赖用户登录授权,仅适用于有用户参与的OAuth2流(比如authorization code flow)。client_credentials是无用户参与的服务到服务调用流,仅支持应用权限,且需对应用权限授予管理员同意后,令牌中才会出现roles声明。
另外,你的请求端点错误:B2C租户不能使用login.microsoft.com/common,必须使用B2C专属的b2clogin.com端点,否则无法正确识别B2C租户配置。
二、B2C租户下的Authorization Code Flow实现步骤
1. 授权请求(获取授权码)
发送GET请求到B2C授权端点:
https://<你的B2C租户名>.b2clogin.com/<你的B2C租户名>.onmicrosoft.com/<你的用户流名称>/oauth2/v2.0/authorize
携带以下参数:
client_id: 你的应用IDresponse_type:coderedirect_uri: 你在B2C应用注册中配置的重定向URI(必须完全匹配)scope:openid offline_access https://graph.microsoft.com/.default(可按需添加其他委派权限)response_mode:query
2. 令牌请求(获取访问令牌+刷新令牌)
拿到授权码后,发送POST请求到B2C令牌端点:
https://<你的B2C租户名>.b2clogin.com/<你的B2C租户名>.onmicrosoft.com/<你的用户流名称>/oauth2/v2.0/token
携带以下form-data格式参数:
client_id: 你的应用IDgrant_type:authorization_codecode: 授权请求返回的授权码redirect_uri: 与授权请求一致的重定向URIclient_secret: 你的客户端密钥(仅当应用为机密客户端时需要)scope: 与授权请求一致的scope
三、关键注意事项
- B2C需提前创建用户流(比如
B2C_1_signup_signin),端点中必须指定该用户流名称。 - 应用注册中需正确配置重定向URI,请求中的
redirect_uri必须与配置完全一致。 - 使用authorization code flow获取的令牌中,会包含
scp声明(对应请求的委派权限),以及由offline_access权限触发的refresh_token。
内容的提问来源于stack exchange,提问作者Madhu77
相关产品推荐
相关产品推荐

