更换Client ID后React Native Google登录报错12500求助
问题场景
在React Native项目中使用react-native-google-signin/google-signin实现Google单点登录(SSO),此前代码运行正常,但更换邮箱和Client ID后出现登录失败,错误信息如下:
{"nativeStackAndroid":[],"userInfo":null,"message":"A non-recoverable sign in failure occurred","code":"12500"}
此前可正常运行的代码:
const googleSignIN = () => { GoogleSignin.configure({ androidClientId: CLIENT_ID }) GoogleSignin.hasPlayServices().then((hasPlayService) => { if (hasPlayService) { GoogleSignin.signIn().then(async (userInfo) => { console.log("userInfo", JSON.stringify(userInfo.user)) setLoading(true); const social_Login_Data = { email: userInfo.user.email, name: userInfo.user.name } console.log("social_Login_Data : ", social_Login_Data); try { const res = await api.post(`/Auth/login-single-signin`, social_Login_Data); console.log("response : ", res.data); if (res.data.ack === 1) { console.log('success'); navigation.navigate('DrawerNavigation') } else { setItem('social_Login_Data', JSON.stringify(social_Login_Data)) navigation.navigate('VerifyEmail',{msg:res.data.message}) } setLoading(false); } catch (e) { setLoading(false); alert(e) } }).catch((e) => { setLoading(false); console.log("ERROR IS1: " + JSON.stringify(e)); }) } }).catch((e) => { console.log("ERROR IS2: " + JSON.stringify(e)); }) }
排查与解决步骤
校验Client ID配置
确保新的Client ID是Google Cloud控制台中为Android平台生成的,而非iOS或Web客户端ID。进入项目的「API和服务→凭据」页面,核对该Client ID对应的包名是否与你项目的android/app/build.gradle里的applicationId完全一致。核对签名证书指纹
Google登录要求应用的签名指纹必须与Cloud控制台中配置的一致,debug和release环境要分别配置:# 获取debug环境SHA-1指纹 keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android # 获取release环境SHA-1指纹 keytool -list -v -keystore 你的release密钥库路径 -alias 密钥别名将生成的SHA-1指纹更新到对应Android Client ID的配置项中。
配置OAuth同意屏幕测试用户
如果你的应用处于「测试」状态,新更换的邮箱需要添加到OAuth同意屏幕的测试用户列表中。进入Google Cloud控制台的「API和服务→OAuth同意屏幕」,在测试用户栏添加该邮箱。清理缓存并重新构建
旧配置缓存可能导致问题,执行以下命令清理后重新构建:# 重置React Native缓存 npx react-native start --reset-cache # 清理Android构建缓存 cd android && ./gradlew clean && cd .. # 重新运行项目 npx react-native run-android优化configure调用时机
避免每次登录都重复调用GoogleSignin.configure,建议将配置移到组件初始化阶段:useEffect(() => { GoogleSignin.configure({ androidClientId: CLIENT_ID }); }, []); const googleSignIN = () => { // 移除原函数内的configure代码,保留后续逻辑 GoogleSignin.hasPlayServices().then(...) }
内容的提问来源于stack exchange,提问作者ViShU

