Link Expo / Google登录firebase auth

时间:2018-04-19 19:35:31

标签: javascript firebase react-native firebase-authentication expo

我正在尝试使用Expo的Google登录功能&将该授权链接到我的firebase身份验证。我无法理解如何将从Expo / google服务接收/使用的身份验证令牌中的数据传输到我的firebase身份验证(即创建一个firebase标识符,UID)。我一直在关注有关linking authsGoogle sign in的世博会文档的文档,这是我获取以下代码的地方。我还在stackoverflow上查看this question,但没有接受的答案。

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

  1. Expo的google登录和firebase的身份验证使用了类似但不同的身份验证方式。 Expo使用Expo.Google.logInAsync()token,而firebase使用firebase.auth.GoogleAuthProvider()auth.currentUser.linkWithRedirect(provider)credential

  2. 如果用户使用下面列出的Expo / Google方法登录,则firebase的数据库中该用户的无记录,没有UID,没有标识符。

  3. 如果用户使用以下方法登录,将如何确保在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};
        }
    }
    

1 个答案:

答案 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()

的侦听器
  

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

当您使用signInWithCredential时,AuthState会更改并触发回调 - 此时您应该触发对firebase数据库的调用 - 捕获详细的所有用户(通过google登录访问)并将其提交到firebase数据库。我在componentDidMount()中设置了这个回调,以便在用户注册时 - 当他们按下提交时,我一直在监听authStateChanges。