【问题标题】:How to link Multiple Auth Providers to an Firebase Account on Android?如何将多个身份验证提供程序链接到 Android 上的 Firebase 帐户?
【发布时间】:2016-10-04 10:33:34
【问题描述】:

我引用了documentation in Firebase 页面。我的问题在这一段:

如果凭据已链接到另一个用户帐户,则对 linkWithCredential 的调用将失败。在这种情况下,您必须根据您的应用处理合并帐户和关联数据:

FirebaseUser prevUser = currentUser; currentUser = auth.signInWithCredential(credential).await().getUser(); // Merge prevUser and currentUser accounts and data // ...

我不知道如何将此代码添加到我的项目中。我何时何地放置此代码

auth.signInWithCredential(credential).await().getUser(); 

进入我的java文件? Android Studio 宣布我无法解析await() 方法。

我应该怎么做才能解决这个问题。提前谢谢!

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

    当 linkWithCredentials 调用失败时,您应该处理这部分代码。

    这是一个小例子:

    mAuth.getCurrentUser().linkWithCredential(credentials).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (!task.isSuccessful()) {
               FirebaseUser prevUser = currentUser; 
               try {
                 currentUser = Tasks.await(auth.signInWithCredential(credential)).getUser();
               } catch (Exception e) {
                 e.printStackStrace();
               }
               // Merge prevUser and currentUser accounts and data 
               // ...
            } else {
    
            }
        }
    });
    

    注意:Task.await() 不再存在,您应该改用 Tasks.await(...) 静态方法。

    【讨论】:

    • 好吧,让我试试这个
    • 我还没有。你在吗?
    • @Adrin Lamit 我们将从那里获得凭据“linkWithCredential(credentials)” ??
    【解决方案2】:

    假设:

    • One account per email address 设置在 firebase 身份验证时启用
    • 用户使用匿名身份验证登录

    linkWithCredential 通常以FirebaseAuthUserCollisionException 失败,这可能是因为此凭据用于之前登录(您可以通过在 firebase 控制台上搜索此电子邮件进行检查)或此电子邮件帐户用于之前登录但使用不同的提供者(例如之前使用 google 登录使用 abc@gmail.com 登录的用户,现在他/她使用 abc@gmail.com 但使用 Facebook 登录)要处理它,您需要 2 个步骤:

    第 1 步:与匿名帐户关联

    private void linkWithAnonymousAccount(final AuthCredential credential) {
        mFirebaseAuth.getCurrentUser().linkWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            getFirebaseToken();
                        } else {
                            Exception exception = task.getException();
                            if (exception instanceof FirebaseAuthUserCollisionException) {
                                signInWithFirebase(credential);
                            } else {
                                Utils.showDialogMessage(mContext, task.getException().getLocalizedMessage());
                            }
                        }
                    }
                });
    }
    

    第 2 步:使用 firebase 签名

    private void signInWithFirebase(AuthCredential credential) {        
        mFirebaseAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            getFirebaseToken();
                        } else {
                            Utils.showDialogMessage(mContext, task.getException().getLocalizedMessage());
                        }
                    }
                });
    }
    

    谷歌说第2步正在合并,因为登录后,您需要获取以前用户的信息并放入新用户。

    希望对您有所帮助。

    【讨论】:

    • getFirebaseToken() 方法是什么?
    • 如果你有自己的后端,通过firebase认证后,你应该得到firebase令牌发送到你的服务器进行验证。详细信息可以在这里找到firebase.google.com/docs/auth/admin/verify-id-tokens
    • 不,我没有自己的后端。我该如何继续使用 Firebase?
    • 如果您没有自己的后端,您可以继续前进而无需获取 Firebase 令牌 ID,例如,您可以转到主屏幕活动。登录成功后,您可以访问在firebase控制台上创建的用户信息或数据库。
    猜你喜欢
    • 2016-10-12
    • 2019-08-17
    • 1970-01-01
    • 2018-03-09
    • 2023-03-15
    • 1970-01-01
    • 2020-08-21
    • 2018-10-31
    • 2018-09-12
    相关资源
    最近更新 更多