Azure AD v2.0端点OpenID Connect响应缺失token_type问题咨询
解决Azure AD v2.0令牌端点仅返回id_token的问题
我刚帮几个朋友排查过类似的迁移问题,这种情况几乎都是请求参数不符合v2.0端点的要求导致的——v2.0比旧版端点对参数的校验严格得多,很多旧版里能“蒙混过关”的参数组合在v2.0里会直接返回不完整的响应。下面是最常见的几个排查方向:
1. 检查response_type或grant_type参数
如果你的令牌请求只返回id_token,很大概率是你没有请求其他类型的令牌:
- 如果你用的是授权码流(推荐生产环境使用),
grant_type必须设为authorization_code,并且在之前的授权请求中,response_type要包含code(比如response_type=code id_token)。这样令牌端点才会返回access_token、token_type、id_token等完整字段。 - 如果你误将
response_type设为纯id_token(隐式流的一种),那令牌端点只会返回id_token,不会有其他字段。
2. 确认scope参数是否正确
v2.0端点要求scope参数必须明确指定,不能留空:
- 必须包含
openid(这是OIDC协议的基础要求); - 如果需要获取
access_token,还要加上对应的API权限范围,比如微软Graph的https://graph.microsoft.com/.default,或者你自定义API的api://your-client-id/access_as_user。
举个例子,正确的scope应该是:scope=openid https://graph.microsoft.com/.default
3. 验证请求格式和必填参数
确保你的请求满足以下要求:
- 请求方法是
POST,Content-Type必须为application/x-www-form-urlencoded(v2.0不接受JSON格式的请求体); - 机密客户端(比如后端服务)必须带上
client_secret,公共客户端(比如SPA)则不需要; - 所有参数(比如
code、redirect_uri)必须和授权阶段使用的完全一致,不能有拼写错误或路径差异。
正确请求示例(授权码流)
POST https://login.microsoftonline.com/common/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id=your-client-id-here &scope=openid https://graph.microsoft.com/.default &code=your-authorization-code-from-auth-step &redirect_uri=https://your-app.com/callback &grant_type=authorization_code &client_secret=your-client-secret-here # 仅机密客户端需要
额外提醒:隐式流的特殊情况
如果你用的是隐式流(不推荐生产用),token_type和access_token是直接返回在授权回调URL的哈希参数里的,不需要再调用令牌端点。这种情况下你应该检查回调URL的哈希部分,而不是令牌端点的响应。
先从这几个方向排查,大概率能解决问题——如果还是不行,可以把你的完整请求参数(脱敏后)贴出来,我再帮你看细节。
内容的提问来源于stack exchange,提问作者DavidA
相关产品推荐
相关产品推荐

