React Native Firebase实现Google登录时AccessToken返回undefined求助
问题出现的核心原因
这个是@react-native-google-signin搭配Firebase做Google登录时的高频踩坑点,本质是你对方法返回值的预期和带离线授权配置的实际逻辑不匹配:
- 你现在已经开启了
offlineAccess: true、forceCodeForRefreshToken: true,本身就是为了拿可长期刷新的refreshToken的离线授权场景,这种场景下首次调用GoogleSignin.signIn()的返回结果里不会直接携带accessToken,只会返回用户基础信息、idToken;accessToken、refreshToken是需要通过专门的token获取接口单独拉取的,直接从signIn返回值解构自然拿到undefined - 如果你是在iOS端运行应用,只填webClientId不补对应的iOS客户端ID,也会导致返回的token字段缺漏
- 如果是在Web浏览器环境调试,原生Google登录组件本身就不会把accessToken直接挂在signIn的返回值上,必须走独立的token获取流程
可直接落地的修改方案
- 调整代码的token获取逻辑
别直接从signIn的返回值里解构accessToken,改成signIn完成后单独调用getTokens()拉取全量token,修改后的代码:const onGoogleButtonPress = async()=> { try { await GoogleSignin.hasPlayServices(); // 完成基础登录流程,拿到用户信息和idToken const signInResult = await GoogleSignin.signIn(); // 单独调用接口拿全量token:accessToken、refreshToken都会在这个返回值里 const { accessToken, refreshToken } = await GoogleSignin.getTokens(); // 给Firebase组装凭证 const credential = auth.GoogleAuthProvider.credential( signInResult.idToken, accessToken ); await auth().signInWithCredential(credential); console.log('成功获取accessToken:', accessToken); console.log('成功获取refreshToken:', refreshToken); console.log('Firebase登录用的idToken:', signInResult.idToken); } catch(error) { console.log('登录流程报错:', error); } finally { setLoggedIn(true); } } - 核对配置项的正确性
- 确保你填的
webClientId是Google Cloud控制台里「Web应用」类型的客户端ID,不要错填成Android/iOS类型的客户端ID,客户端类型不匹配会直接导致授权链路拿不到合法token - 如果是iOS端运行,需要在
configure里补上对应的iosClientId,仅靠webClientId没法完成iOS端的全量授权校验
- 确保你填的
- 提前清缓存避免拿不到全量授权
如果你之前用同一个Google账号在应用里登过,本地会存旧的授权缓存,这种情况下就算改了代码,首次登录还是可能拿不到完整token。需要先在登录前加一行await GoogleSignin.signOut()清空旧缓存,重新走完整的授权同意流程,确保你选的测试账号被添加到OAuth同意屏幕的测试用户列表里,你申请的calendar权限没有被审核拦截。 - 版本匹配提醒
如果你用的是v6以下的旧版@react-native-google-signin,返回值结构和v7以上的版本差异很大,旧版本里accessToken是直接挂在signIn返回值里的,升级到新版之后如果不调整token获取逻辑,就会直接出现accessToken为undefined的情况。
内容的提问来源于stack exchange,提问作者Prabhakar kotipalli
相关产品推荐
相关产品推荐

