Google OAuth scope包含profile时返回id_token缺失name字段问题
问题原因
- 你当前使用的
response_type=id_token属于OAuth2隐式授权流,Google默认不会将profilescope对应的扩展字段(包括name、头像地址等)嵌入返回的id_token中,仅会返回iss、sub、email、email_verified这类核心身份字段,这是该场景下最常见的缺失原因。 - 小概率为用户Google账号未设置公开姓名,或用户在授权弹窗中手动拒绝了profile权限的授予。
解决方案
- 方案1:显式声明要求id_token返回name字段
构造授权请求URL时,额外添加claims参数,指定要求id_token中返回name字段,参数值需要做URL编码:
未编码的参数值为:{"id_token": {"name": null}}
编码后参数为:claims=%7B%22id_token%22%3A%20%7B%22name%22%3A%20null%7D%7D
调整后的完整授权URL示例:
https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?redirect_uri=MY_REDIRECT_URL&response_type=id_token&scope=email+profile+openid&client_id=MY_CLIENT_ID&claims=%7B%22id_token%22%3A%20%7B%22name%22%3A%20null%7D%7D
配置完成后重新发起授权,返回的id_token解码后就会包含name字段。
方案2:调用用户信息接口获取完整字段
将授权请求的response_type参数调整为id_token token,授权成功后可同时获取id_token和access_token,后端校验完id_token有效性后,用access_token请求Google用户信息接口获取完整的profile数据,即可拿到name等扩展字段。排查补充项
如果调整参数后仍有部分用户返回结果缺失name,可在授权请求中添加prompt=consent参数,强制用户每次授权时重新确认权限,避免用户之前误拒profile权限的情况。
内容的提问来源于stack exchange,提问作者user12125591
相关产品推荐
相关产品推荐

