在我的firebase仪表板中,我为一个电子邮件选项设置了多个帐户.
我的应用程序中有简单的电子邮件,Facebook和Google Plus身份验证.
我在LoginActivity中处理它们中的每一个:
Google Plus:
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
dialog.dismiss();
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
FirebaseUser user = mAuth.getCurrentUser();
proceed();
} else {
// If sign in fails, display a message to the user.
Toast.makeText(LoginActivity.this, task.getException().getMessage(),
Toast.LENGTH_SHORT).show();
}
// ...
}
});
}
Facebook的:
private void handleFacebookAccesstoken(Accesstoken token) {
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
dialog.show();
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
dialog.dismiss();
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
FirebaseUser user = mAuth.getCurrentUser();
proceed();
} else {
Toast.makeText(LoginActivity.this, task.getException().getMessage(),
Toast.LENGTH_SHORT).show();
}
}
});
}
简单邮件:
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
dialog.dismiss();
proceed();
} else {
Toast.makeText(LoginActivity.this, "Wrong email or password", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
}
});
现在,我希望让拥有相同电子邮件的用户能够通过Facebook和Google Plus对Facebook和Google Plus进行授权.
这个this documentation文档说我应该跳过FirebaseAuth.signInWith方法并调用这些函数:
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
mAuth.getCurrentUser().linkWithCredential(credential)
现在令人困惑.当它仍然为null时,我如何调用getCurrentUser因为我跳过了signInWith方法?
文档还说我处理合并时我不明白.
currentUser = auth.signInWithCredential(credential).await().getUser();
此外,signInWithCredenial没有await方法.
解决方法:
要链接帐户,应该有一个现有的会话.例如,假设新用户使用Google作为身份验证提供商创建帐户.
总之,要做到这一点,您需要:
>使用GIDSignIn通过Google对用户进行身份验证.
>然后Google返回一个Id令牌(如果一切顺利).
>您将使用令牌创建GoogleAuthProvider凭据对象.
>然后您使用此凭据在Firebase中调用signInWithCredential进行身份验证.
该过程与Facebook等其他auth提供商类似.为了将帐户与Facebook链接,您需要执行上面提到的前三个步骤(与Facebook auth相关),而不是“signInWithCredential”,您需要调用“linkWithCredential”.如果一切顺利,现在用户将能够使用Google或Facebook对同一帐户进行身份验证.
如果您调用“signInWithCredential”,您将创建一个使用Facebook作为身份验证提供程序的新帐户.因此,用户将无法访问具有两个(或更多)身份验证提供程序的单个帐户,该用户将为每个身份验证提供程序提供两个单独的帐户.这就是documentation说你应该跳过调用FirebaseAuth.signInWith方法的原因.
关于合并的问题,文档提到:“如果凭据已经链接到另一个用户帐户,则对linkWithCredential的调用将失败”.这意味着用户已经拥有auth提供商的帐户.如果您希望用户从两个帐户访问信息,您将需要创建逻辑以将来自一个帐户的信息合并到另一个帐户.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。