链接 Expo/Google 登录到 firebase auth



我正在尝试使用世博会的谷歌登录功能并将该授权链接到我的火力基础身份验证。我无法理解如何将数据从世博会/谷歌服务接收/使用的身份验证令牌传输到我的火碱身份验证(即创建火基标识符 UID)。我一直在关注有关链接身份验证的文档和用于 Google 登录的世博会文档,这是我获得以下代码的地方。我也在stackoverflow上查看了这个问题,但没有公认的答案。

对我来说,两个主要的困惑点是:

  1. Expo的谷歌登录和Firebase的身份验证使用相似但不同的方法来验证用户。世博会使用Expo.Google.logInAsync()token,而火力基地使用firebase.auth.GoogleAuthProvider()auth.currentUser.linkWithRedirect(provider)credential

  2. 如果用户使用下面包含的 Expo/Google 方法登录,Firebase 的数据库中没有该用户的记录,没有UID,也没有标识符。

如何确保如果用户使用以下方法登录,则会在Firebase身份验证中创建用户? 就像使用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};
}
}

我对此的方法几乎是文档所说的,但我确实必须连接很多点,它并不都在一个地方 - 我可以帮助您解决困惑(我也有)

解决您的第一点 - 基本上通过使用

const result = await Expo.Google.logInAsync({

您正在做的是获取用户的谷歌详细信息(世博会正在处理正在进行的logInAsync调用)。

我将其与 firebase 联系起来的方法是使用博览会提供的详细信息来创建 firebase 谷歌登录凭据,然后使用此凭据登录。Firebase 提供对 GoogleAuthProvider 的访问

https://firebase.google.com/docs/reference/js/firebase.auth.GoogleAuthProvider

世博会返回的详细信息(在您的例子中为"结果")允许您访问idToken和accessToken,因此,通过使用:

const credential = firebase.auth.GoogleAuthProvider.credential(idToken, accessToken);

您可以创建 Firebase Google 凭据,然后可以利用

firebase.auth().signInWithCredential(credential)

Firebase会将其注册为谷歌凭据,并使用用户的谷歌详细信息注册/登录。(更改身份验证状态)

致你第二点—— Firebase 允许您设置一个名为 onAuthStateChanged() 的侦听器

https://firebase.google.com/docs/auth/web/manage-users

当您使用 signInWithCredential 时,身份验证状态会发生变化并触发回调 - 此时您应该触发对 Firebase 数据库的调用 - 捕获所有详细用户(通过 Google 登录访问)并将其提交到 Firebase 数据库中。我在 componentDidMount() 中设置了这个回调,以便在用户注册时 - 当他们按提交时,我一直在监听 authStateChanges。

最新更新