仅使用openid scope时,如何从Google Identity Services的JWT中排除邮箱?
问题分析与解决方案
核心误解澄清
仅指定openid scope时,Google的ID Token仍可能包含用户邮箱——这是Google OpenID Connect实现的默认行为,邮箱属于Google用户的基础标识字段,即使未显式请求email scope,只要用户完成认证,Google通常会将其包含在ID Token中。
关键问题排查与修复
- 明确指定请求的Scope
你的代码中未设置scope参数,Google One Tap默认会请求openid email profile组合scope,这可能是你拿到邮箱的直接原因。需要在初始化时显式指定仅openid:
window.google.accounts.id.initialize({ client_id: "MY_CLIENT_ID.apps.googleusercontent.com", callback: handleCredentialResponse, scope: "openid" // 新增此行,强制仅请求openid scope });
- 验证OAuth同意屏幕配置
进入Google Cloud Console的「OAuth同意屏幕」页面,确认:
- 「已授权的范围」中仅保留
openid,删除email、profile等其他scope - 配置保存后等待5-10分钟生效(Google的配置同步存在延迟)
额外说明
如果严格执行上述配置后,ID Token仍包含邮箱字段,这属于Google OpenID实现的特性——Google会默认返回部分基础用户标识信息(包括邮箱),无法通过scope完全移除。此时你只需在后端处理ID Token时忽略email和email_verified字段即可,完全不影响仅基于sub(用户唯一标识)的认证逻辑。
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

