Expo构建Android APK时谷歌登录提示请求无效问题排查
解决Expo构建APK后谷歌登录"Access blocked: This app's request is invalid"问题
核心原因分析
Expo Go中使用webClientId正常是因为Expo的默认签名和包名已在谷歌配置中,但自建APK时用了独立的签名与包名,若谷歌控制台未做对应配置,就会触发无效请求错误。
解决方案
1. 校验Google Cloud控制台的Android客户端配置
- SHA-1指纹必须匹配构建APK的签名:
- 本地构建APK:用签名密钥生成指纹,执行命令:
keytool -list -v -keystore 你的签名密钥文件.jks -alias 密钥别名 - EAS构建:在EAS Dashboard查看构建的SHA-1指纹,或执行
eas credentials查看 - 将该指纹添加到Google Cloud控制台对应Android客户端的"签名证书指纹"中
- 本地构建APK:用签名密钥生成指纹,执行命令:
- 包名必须严格一致:确保Google Cloud中的Android客户端包名与
app.json里android.package字段完全相同
2. 确认androidClientId配置正确
- 从Google Cloud控制台的Android客户端详情页复制完整Client ID,确保
.env文件中的androidClientId变量完全匹配,无拼写或空格错误 - 代码中确保
Google.useIdTokenAuthRequest正确传入androidClientId:const [request, response,promptAsync] = Google.useIdTokenAuthRequest({ androidClientId: androidClientId, });
3. 修正代码中的异步逻辑问题
原代码中useEffect依赖accessToken,但setAccessToken是异步操作,会导致getUserInfo可能拿到旧的accessToken,修改如下:
useEffect(() => { if(response?.type === 'success'){ const { accessToken } = response.authentication; setAccessToken(accessToken); getUserInfo(accessToken); // 直接传入最新token,无需等待state更新 } },[response]) async function getUserInfo(token){ let result = await fetch("https://www.googleapis.com/userinfo/v2/me",{ headers: {Authorization: `Bearer ${token}` } }); const userInfo = await result.json(); setUserInfo(userInfo); }
4. 可选:显式配置Redirect URI
部分场景下需手动指定重定向URI,确保与谷歌控制台配置一致:
- 在
app.json中添加scheme:{ "expo": { "scheme": "your-app-scheme" // 自定义,比如com-yourapp-name } } - 在请求中添加redirectUri:
import { makeRedirectUri } from 'expo-auth-session'; const [request, response,promptAsync] = Google.useIdTokenAuthRequest({ androidClientId: androidClientId, redirectUri: makeRedirectUri({ scheme: 'your-app-scheme' }) });
内容的提问来源于stack exchange,提问作者Alireza hoseini
相关产品推荐
相关产品推荐

