You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Expo Auth Session的Google Sign In获取用户邮箱?

核心问题成因

问题来自两个独立的逻辑断层,不是SDK本身的功能缺陷:

  • 原代码对Google.useAuthRequest的参数传递存在错位,申请邮箱权限的配置完全没有生效
  • Google OAuth2的授权成功响应本身就不会直接内嵌用户邮箱等个人信息,需要通过授权凭证额外获取
具体修复步骤

1. 修正SDK参数传参逻辑

参数错位是导致权限申请失效的核心原因:Google.useAuthRequest的参数规则是「基础配置对象 + 可选重定向URI字符串 + 可选额外请求参数」,原代码中把包含scopes的配置对象,错误传到了本该是重定向URI的第二个参数位置,导致邮箱权限申请的配置根本没有被纳入授权请求,自然无法获得读取邮箱的权限。
正确的传参方式是把所有配置(包括scopes)统一放在第一个基础配置对象中:

  • 申请邮箱权限需要的scopes建议配置为["openid", "email", "profile"],仅配置email有时会出现令牌解析异常
  • 不需要额外传入错位的空对象参数,SDK会自动匹配Expo环境的默认重定向规则

2. 从授权凭证中提取用户邮箱

授权流程成功后,response对象中只会返回生成的授权令牌,不会直接携带用户字段,可以通过两种方式获取邮箱:

  • 本地解析返回的idToken(本身是JWT格式):将令牌拆分后解码payload部分,权限配置正确时,payload中会直接包含用户邮箱字段,不需要额外发起网络请求
  • 携带获取到的accessToken请求Google开放的用户信息接口,拉取包含邮箱的完整用户公开资料
修正后的完整代码示例
var LoginGoogle = () => {
  const [request, response, promptAsync] = Google.useAuthRequest({
    androidClientId: 'xxxxxxx.apps.googleusercontent.com',
    expoClientId: 'xxxxxxx.apps.googleusercontent.com',
    scopes: ["openid", "email", "profile"]
  });
  
  React.useEffect(() => {
    if (response?.type === 'success') {
      const { authentication } = response;
      // 本地解析idToken获取邮箱
      const tokenPayload = JSON.parse(atob(authentication.idToken.split('.')[1]));
      console.log('用户邮箱:', tokenPayload.email);
    }
  }, [response]);

  return (
    <GoogleSocialButton disabled={!request} onPress={() => {promptAsync()}} />
  ) 
}
常见校验点
  • 确认Google Cloud控制台中对应客户端ID已开启Google Sign-In API,授权重定向URI和项目配置完全匹配
  • 如果解析令牌后发现payload中没有email字段,基本就是权限申请配置没有生效,需要检查scopes是否正确传入授权请求
  • 不要期望授权响应直接返回用户资料,这是OAuth2授权流程的标准设计,所有用户信息都需要通过授权凭证换取

内容的提问来源于stack exchange,提问作者Jacs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 04:27:03