Expo-auth-session中Google.useAuthRequest()返回success但authentication为null
Expo裸机Android谷歌登录:success但无access_token问题解决
为什么会出现这个情况?
从Expo托管工作流切换到裸机Android后,expo-auth-session的谷歌授权默认流程从隐式授权流(直接返回access_token)变成了授权码流(返回code,需后端换token),这是裸机环境下的安全适配逻辑,所以会出现success但authentication为null、只有code的情况。
解决办法
1. 强制使用隐式授权流(快速调试)
在Google.useAuthRequest里显式指定responseType: 'token',就能回到之前直接拿access_token的逻辑:
const [request, response, promptAsync] = Google.useAuthRequest({ androidClientId: '你的Android客户端ID', responseType: 'token', // 关键配置 });
⚠️ 注意:隐式流安全性较低,仅适合测试,生产环境不建议用。
2. 切换到授权码流(生产环境推荐)
如果要遵循安全规范,需要把前端拿到的code传给后端,由后端调用谷歌令牌接口换access_token:
- 后端请求地址:
https://oauth2.googleapis.com/token - 请求参数(POST表单格式):
code: 前端返回的授权码client_id: 你的Android客户端IDclient_secret: 谷歌云控制台中生成的Android客户端密钥(注意保密)redirect_uri:com.your.app:/oauthredirect(要和谷歌控制台、app.json的scheme一致)grant_type:authorization_code
3. 检查谷歌云控制台配置
- 签名指纹匹配:裸机Android的debug/release签名指纹和Expo托管的默认指纹不一样,必须在谷歌控制台的Android客户端配置里添加当前项目的签名指纹。
- redirect_uri一致:确保谷歌控制台里配置的redirect_uri和
app.json中android.scheme字段对应,格式为你的包名:/oauthredirect。
4. 确认Expo配置生效
- 检查
app.json里的android.package和scheme是否正确配置:
{ "expo": { "android": { "package": "com.your.app", "scheme": "com.your.app" } } }
- 运行
npx expo prebuild重新生成原生文件,确保配置同步到Android项目中。
内容的提问来源于stack exchange,提问作者Sir Vico
相关产品推荐
相关产品推荐

