React Native Expo中Google OAuth2.0 iOS正常Android无法使用问题求助
Android端Google OAuth登录失败排查方案
1. 生产环境SHA-1证书指纹配置问题
- 生产环境Android应用的签名证书与开发环境不同,必须在Google Cloud的Android凭据中添加生产环境的SHA-1指纹,不能仅配置开发环境的指纹。
- 获取生产证书SHA-1的命令:
keytool -list -v -keystore 你的生产密钥库路径.jks -alias 你的密钥别名 - 登录Google Cloud控制台,确认对应Android OAuth客户端ID的签名证书指纹已包含生产环境的SHA-1值。
2. 包名/应用ID匹配问题
- 检查Google Cloud中Android凭据的包名,必须与Expo生产构建时使用的包名完全一致(Android包名需全小写)。
- 若使用
eas build,确认app.json/app.config.js中android.package字段的值,与Google Cloud配置的包名无任何差异。
3. Expo Auth Session生产环境配置缺失
- 在
app.json中确认expo.scheme字段已正确设置,该scheme需与Google Cloud中Android凭据的授权重定向URI匹配(格式通常为your-app-scheme://oauthredirect)。 - 显式指定
redirectUri参数,避免生产环境下的自动匹配问题:const [request, response, promptAsync] = Google.useAuthRequest({ clientId: Platform.OS === 'android' ? 'credentialAndroid.apps.googleusercontent.com' : 'credentialios.apps.googleusercontent.com', redirectUri: makeRedirectUri({ scheme: '你的app scheme', }), });
4. 网络与权限检查
- 确认Android生产设备可正常访问Google服务,部分地区需确保网络环境支持。
- 检查
app.json中是否保留了必要权限(Expo默认包含,但自定义配置可能移除):"android": { "permissions": ["INTERNET"] }
5. 代码潜在问题修正
- 你的
getUserInfo函数获取用户信息后未更新状态或保存到本地,补充以下代码:async function getUserInfo(token) { try { const response = await fetch( "https://www.googleapis.com/userinfo/v2/me", { headers: { Authorization: `Bearer ${token}` } } ) const user = await response.json(); setUser(user); // 更新用户状态 await AsyncStorage.setItem('@user', JSON.stringify(user)); // 保存到本地存储 } catch (error) { console.log('Error fetching user info:', error.message); } } - 修正Android端
clientId的空格问题:clientId: Platform.OS === 'android' ? 'credentialAndroid.apps.googleusercontent.com' : 'credentialios.apps.googleusercontent.com',
6. Expo Go与生产构建的差异
- 若Expo Go中Android登录正常,但生产构建后失败,几乎可以确定是签名指纹或包名不匹配——Expo Go使用Expo官方签名证书,而生产构建使用你自己的证书,两者指纹不同。
内容的提问来源于stack exchange,提问作者Gonza
相关产品推荐
相关产品推荐

