Android Firebase身份验证 - 如何将现有用户帐户链接到匿名帐户

时间:2018-04-03 07:40:23

标签: firebase firebase-authentication

我在理解如何将现有电子邮件帐户链接到匿名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;
}

}

在用户从匿名用户转换为真实帐户后调用此方法。我怎么才能知道凭证,以便我可以删除匿名帐户?

1 个答案:

答案 0 :(得分: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

以下是一个使用web的示例,给定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();
  })
})