【问题标题】:Android Firebase Authentication - How to Link Existing User Account to Anonymous AccountAndroid Firebase 身份验证 - 如何将现有用户帐户链接到匿名帐户
【发布时间】:2018-09-12 11:09:52
【问题描述】:

我在理解如何将现有电子邮件帐户链接到匿名 Firebase 帐户时遇到了一些麻烦。这可能吗 ?还是仅在电子邮件帐户是新帐户时才链接?

当我调用以下代码来链接帐户时,匿名帐户和现有帐户都存在。但是如果它是一个新的电子邮件帐户,那么我会看到新的电子邮件帐户与匿名帐户的 uid 相同,并且匿名帐户已经消失。

mAuth.getCurrentUser().linkWithCredential(credential)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "linkWithCredential:success");
                    FirebaseUser user = task.getResult().getUser();
                    updateUI(user);
                } else {
                    Log.w(TAG, "linkWithCredential:failure", task.getException());
                    Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                    updateUI(null);
                }

                // ...
            }
        });

所以我的问题是:我可以将匿名用户帐户链接到现有用户帐户吗?因为那时我的firebase控制台将充满匿名用户条目。

更新:使用 firebase mergService here 如何删除匿名帐户?我没有看到它返回凭据让我删除。

mergeService 描述如下:

public class MyManualMergeService extends ManualMergeService {
private Iterable<DataSnapshot> mChatKeys;

@Override
public Task<Void> onLoadData() {
    final TaskCompletionSource<Void> loadTask = new TaskCompletionSource<>();
    FirebaseDatabase.getInstance()
            .getReference()
            .child("chatIndices")
            .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    mChatKeys = snapshot.getChildren();
                    loadTask.setResult(null);
                }

                @Override
                public void onCancelled(DatabaseError error) {
                    FirebaseCrash.report(error.toException());
                }
            });
    return loadTask.getTask();
}

@Override
public Task<Void> onTransferData(IdpResponse response) {
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference chatIndices = FirebaseDatabase.getInstance()
            .getReference()
            .child("chatIndices")
            .child(uid);
    for (DataSnapshot snapshot : mChatKeys) {
        chatIndices.child(snapshot.getKey()).setValue(true);
        DatabaseReference chat = FirebaseDatabase.getInstance()
                .getReference()
                .child("chats")
                .child(snapshot.getKey());
        chat.child("uid").setValue(uid);
        chat.child("name").setValue("User " + uid.substring(0, 6));
    }
    return null;
}

}

在用户从匿名用户转换为真实帐户后调用此方法。那么我如何知道凭据以便删除匿名帐户?

【问题讨论】:

  • Firebase 团队已回答您的问题! youtu.be/lbGEu0PNsfY?t=1m57s
  • 我没想到来源本身会给出答案。哈哈,谢谢你的更新。

标签: firebase firebase-authentication


【解决方案1】:

您无法将现有凭据链接到匿名用户。 您基本上必须将匿名用户的数据复制到现有的凭据用户,然后删除匿名用户。

Firebase 无法为您处理此问题。您有 2 个具有不同 uids 的用户,并且每个用户都保存了数据,更不用说每个用户的个人资料数据不同了。 Firebase 不知道要保留哪个用户以及如何合并配置文件/数据。在某些情况下,数据可以保存在 Firebase 服务之外。

FirebaseUI 目前正在使用类似的机制来升级登录时的匿名用户。如果凭据是新的,那么链接将成功,无需任何额外操作。如果凭证已经存在,链接会失败,开发者需要处理合并冲突,复制非匿名用户的数据,之后删除匿名用户。

这是 FirebaseUI-web 中的网络流:https://github.com/firebase/firebaseui-web#upgrading-anonymous-users

这是为 FirebaseUI-android 实现的: https://github.com/firebase/FirebaseUI-Android/pull/1185

这是一个网络示例,给定 authCredential 和一个匿名用户登录。

这是一个如何处理合并冲突的简单 Web 示例。

let data;
// Default App with anonymous user.
const app = firebase.app();
// Anonymous user.
anonymousUser = app.auth().currentUser;
// Get anonymous user data.
app.database().ref('users/' + app.auth().currentUser.uid)
  .once('value')
  .then(snapshot => {
    // Store anonymous user data.
    data = snapshot.val();
    // Sign in credential user.
    return app.auth().signInWithCredential(authCredential);
  })
  .then(user => {
    // Save the anonymous user's data to the credential user.
    return app.database().ref('users/' + user.uid).set(data);
  })
  .then(() => {
    // Delete anonymnous user.
    return anonymousUser.delete();
  })
})

【讨论】:

  • 你能告诉我如何使用 mergeService 删除帐户吗?我会更新我的问题
  • 我添加了一个网络示例。
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
相关资源
最近更新 更多