React Native Firebase谷歌登录报googleUser.getAuthResponse is not a function求解
报错根本原因
你混用了Web端Google登录SDK的返回对象结构和Expo expo-google-app-auth 库的返回结构。Web端gapi库返回的Google用户对象带有getAuthResponse、getBasicProfile这类实例方法,但Expo的logInAsync接口调用成功后返回的是普通JSON对象,所有身份凭证、用户信息都是直接挂载的属性,没有对应方法,所以调用getAuthResponse会抛出未定义的错误。
修复方案
- 修改
isUserEqual方法的用户匹配逻辑,将googleUser.getBasicProfile().getId()替换为googleUser.user.id,Expo返回的用户基础信息全部存在user属性下。 - 修改
onSignIn方法中凭证生成逻辑,将googleUser.getAuthResponse().id_token替换为googleUser.idToken,Expo返回的结果中直接带有idToken属性,无需调用方法获取。 - 建议统一Firebase SDK的调用写法,你当前代码同时导入了Firebase v9的模块化API,又使用了v8版本的
firebase.auth()链式调用写法,写法不统一容易引发后续其他报错,如果使用v8版本可以删除顶部v9相关API的导入语句。
核心修改代码示例
修复后的isUserEqual方法
isUserEqual(googleUser, firebaseUser) { if (firebaseUser) { var providerData = firebaseUser.providerData; for (var i = 0; i < providerData.length; i++) { if ( providerData[i].providerId === firebase.auth.GoogleAuthProvider.PROVIDER_ID && providerData[i].uid === googleUser.user.id ) { return true; } } } return false; }
修复后的凭证生成逻辑
const credential = firebase.auth.GoogleAuthProvider.credential( googleUser.idToken );
补充提示
如果后续需要获取其他用户信息,直接打印googleUser对象即可看到所有可用属性,所有信息都可以直接读取,不需要调用任何方法。
内容的提问来源于stack exchange,提问作者Matt Laszcz
相关产品推荐
相关产品推荐

