React Native集成Google OAuth遇12500错误,求排查方案
解决React Native Google Signin 12500错误的排查要点
针对你遇到的12500非恢复性登录失败错误,结合你的配置情况,以下是容易遗漏的排查点:
1. 修正Scope权限
你当前使用的drive.readonly是只读权限,但要往Google Sheet写入数据,需要替换为写入权限,比如:
https://www.googleapis.com/auth/spreadsheets:允许读写所有Google表格https://www.googleapis.com/auth/drive.file:仅允许读写用户通过你的应用创建或打开的文件(更安全)
权限不匹配会导致OAuth流程验证失败,直接触发12500错误。
2. 移除Web Client ID的末尾空格
你的WEB_CLIENT_ID末尾存在多余空格:'123crnslgq7d.apps.googleusercontent.com ',这个空格会导致客户端ID验证不通过,必须删除。
3. 补全平台专属OAuth客户端配置
你只确认了Web Client ID,但React Native应用需要对应平台的客户端配置:
- Android:在Google Console创建「Android类型」OAuth客户端,填写正确的SHA-1签名(debug和release版本都要加),且包名必须和
android/app/build.gradle中的applicationId完全一致。 - iOS:创建「iOS类型」OAuth客户端,Bundle ID要与Xcode中的Bundle Identifier匹配,同时在Xcode中启用Keychain Sharing,并在Info.plist添加对应Google客户端ID的URL Scheme。
4. 完善OAuth同意屏幕配置
- 确保OAuth同意屏幕的应用名称、支持邮箱已正确填写,且在「范围」列表中添加了你代码中使用的所有权限Scope(比如修改后的spreadsheets权限)。
- 即使是测试用户,也需要完成同意屏幕的基础配置并提交(无需公开审核,测试用户可正常使用)。
5. 检查原生端库配置完整性
确认@react-native-google-signin/google-signin的原生配置已完成:
- Android:修改
android/build.gradle添加Google服务依赖,android/app/build.gradle配置签名信息。 - iOS:执行
pod install,并在Info.plist中添加Google登录相关的URL Scheme和权限描述。
修正后的代码示例
import React, { useEffect } from 'react'; import { GoogleSignin, GoogleSigninButton, statusCodes, } from '@react-native-google-signin/google-signin'; // 移除末尾空格 const WEB_CLIENT_ID = '123crnslgq7d.apps.googleusercontent.com'; GoogleSignin.configure({ // 替换为写入Google Sheet所需的权限 scopes: ['https://www.googleapis.com/auth/spreadsheets'], webClientId: WEB_CLIENT_ID, offlineAccess: true, // 可选,若需要获取刷新令牌用于后续后台请求 }); const signIn = async () => { try { await GoogleSignin.hasPlayServices(); const userInfo = await GoogleSignin.signIn(); console.log(userInfo) } catch (error) { console.log(JSON.stringify(error)) // 可根据状态码做针对性处理 switch(error.code) { case statusCodes.SIGN_IN_CANCELLED: console.log('用户取消登录'); break; case statusCodes.IN_PROGRESS: console.log('登录流程已在进行中'); break; case statusCodes.PLAY_SERVICES_NOT_AVAILABLE: console.log('Google Play服务版本过低或未安装'); break; } } }; function App(): JSX.Element { useEffect(()=>{ signIn(); }, []) return ( <> Test </> ) }
内容的提问来源于stack exchange,提问作者djulb
相关产品推荐
相关产品推荐

