我在理解如何将现有电子邮件帐户链接到匿名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;
}
}
在用户从匿名用户转换为真实帐户后调用此方法。我怎么才能知道凭证,以便我可以删除匿名帐户?
答案 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();
})
})