我正在尝试使用Expo的Google登录功能&将该授权链接到我的firebase身份验证。我无法理解如何将从Expo / google服务接收/使用的身份验证令牌中的数据传输到我的firebase身份验证(即创建一个firebase标识符,UID)。我一直在关注有关linking auths和Google sign in的世博会文档的文档,这是我获取以下代码的地方。我还在stackoverflow上查看this question,但没有接受的答案。
对我来说,两个主要的困惑点是:
Expo的google登录和firebase的身份验证使用了类似但不同的身份验证方式。 Expo使用Expo.Google.logInAsync()
和token
,而firebase使用firebase.auth.GoogleAuthProvider()
,auth.currentUser.linkWithRedirect(provider)
和credential
。
如果用户使用下面列出的Expo / Google方法登录,则firebase的数据库中该用户的无记录,没有UID,没有标识符。
如果用户使用以下方法登录,将如何确保在firebase auth中创建用户?比如当使用firebase.auth().createUserWithEmailAndPassword()
async logInWithGoogleAsync() {
try {
const result = await Expo.Google.logInAsync({
iosClientId: 'XXX',
scopes: ['profile', 'email'],
});
if(result.type === 'success') {
//LINK ACCOUNTS HERE?
//Use result.accessToken somehow?
return;
}
else {
return {cancelled: true};
}
}
catch(e) {
return {error: true};
}
}
答案 0 :(得分:2)
我对此的处理几乎就是文件所说的,但我确实必须连接几个点,而不是一个地方 - 我可以帮助解决你的困惑(我也有它们)
解决你的第一点 - 基本上是通过使用
const result =等待Expo.Google.logInAsync({
您正在做的是获取用户的Google详细信息(Expo正在处理正在进行的logInAsync调用)。
我将此与firebase链接的方法是使用展示提供的详细信息来创建firebase google登录凭据,然后使用此凭据进行登录。 Firebase提供对GoogleAuthProvider
的访问权限https://firebase.google.com/docs/reference/js/firebase.auth.GoogleAuthProvider
Expo返回的详细信息(在您的情况下"结果")可让您访问idToken& accessToken,所以,使用:
const credential = firebase.auth.GoogleAuthProvider.credential(idToken,accessToken);
你可以创建一个firebase谷歌凭证,然后你可以利用
firebase.auth()。signInWithCredential(凭证)
firebase会将此注册为Google凭据,并使用他们的Google详细信息为用户注册/登录。 (更改AuthState)
给你第二点 - Firebase允许您设置名为onAuthStateChanged()
的侦听器当您使用signInWithCredential时,AuthState会更改并触发回调 - 此时您应该触发对firebase数据库的调用 - 捕获详细的所有用户(通过google登录访问)并将其提交到firebase数据库。我在componentDidMount()中设置了这个回调,以便在用户注册时 - 当他们按下提交时,我一直在监听authStateChanges。