OAuth 2.0授权过程中如何成功获取id_token?
OAuth 2.0 对接获取id_token的正确配置
id_token 不是原生OAuth 2.0协议定义的返回字段,它是构建在OAuth2之上的OpenID Connect(OIDC)身份层协议的专属返回值,纯OAuth2授权接口无论怎么调都不会返回这个字段,请求没拿到id_token基本是配置缺失或错误导致的:
必补核心参数
不管是首次用授权码换token,还是用refresh_token刷新token,缺了这个参数100%拿不到id_token:
- 必须在请求参数中加入
scope=openid,这是OIDC协议的强制要求,只有scope包含openid时,授权服务器才会触发OIDC逻辑,签发和返回id_token。如果需要同时获取用户基础资料、邮箱等信息,可以在scope里追加profile、email等值,多个scope用空格分隔。
两类常见请求场景的正确配置
1. 授权码流程首次换取token
请求地址为对应平台的OIDC token端点(注意不要用平台旧版纯OAuth2的token接口,部分平台两个接口是分开的),POST表单参数除了client_id、client_secret、redirect_uri,还要补全:
grant_type固定赋值为authorization_code- 传入授权流程拿到的
code参数(这个场景不需要传refresh_token) - 部分平台要求额外传
nonce参数做请求防重放,按平台要求生成随机字符串传入即可
2. 用refresh_token刷新获取id_token
也就是当前调试的场景,除了已经传入的client_id、client_secret、refresh_token、redirect_uri,还要补全:
grant_type固定赋值为refresh_token- 必传
scope=openid,注意传入的scope范围不能超过首次授权时用户同意的scope范围,否则请求会被拒绝 - 检查当前使用的refresh_token本身是否是OIDC流程签发的:如果首次发起授权请求时就没带
openidscope,服务器签发的refresh_token本身不绑定身份上下文,用它刷新永远拿不到id_token,这种情况需要重新走完整授权流程,初始授权阶段就带上openid scope,拿到新的合法refresh_token再调用刷新接口。
其他容易踩的配置问题
- 确认在授权平台创建的应用已经开启OIDC相关权限:部分平台默认仅开启纯OAuth2权限,只返回access_token和refresh_token,需要手动在应用配置页开启「OIDC身份认证」「返回id_token」类的开关,否则参数传对也不会返回对应字段。
- 检查client_secret的传输方式:部分平台要求将
client_id和client_secret放在HTTP Basic Auth请求头中传输,而非放在POST表单参数里,传参位置错误可能导致接口走纯OAuth2逻辑,不返回id_token。
正确的刷新请求示例
POST /oidc/token HTTP/1.1 Host: 你对接的授权服务域名 Content-Type: application/x-www-form-urlencoded grant_type=refresh_token& client_id=你的应用客户端ID& client_secret=你的应用客户端密钥& refresh_token=你持有的有效刷新令牌& redirect_uri=你在平台配置的合法回调地址& scope=openid profile email
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

