gpt4 book ai didi

Android Firebase 将多个帐户提供商与匹配的电子邮件链接起来

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:17 26 4
gpt4 key购买 nike

在我的 firebase 仪表板中,我设置了多个帐户用于一封电子邮件选项。

我的应用程序中有简单的电子邮件、Facebook 和 Google Plus 身份验证。

我在我的 LoginActivity 中像这样处理它们中的每一个:

Google+:

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)

现在很困惑。 因为我跳过了 signInWith 方法,所以当 getCurrentUser 仍然为 null 时如何调用它?

文档还说我处理我不理解的合并。

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

此外,signInWithCredenial 没有 await 方法。

这意味着我应该在登录后使用同一电子邮件链接多个帐户?

最佳答案

要链接帐户,应该有一个现有 session 。例如,假设一位新用户使用 Google 作为授权提供商创建了一个帐户。

总而言之,要做到这一点,您需要:

  • 使用 GIDSignIn 向 Google 验证用户身份。
  • 然后 Google 返回一个 Id token (如果一切顺利的话)。
  • 您将使用 token 创建 GoogleAuthProvider 凭据对象。
  • 然后您使用此凭据在 Firebase 中调用 signInWithCredential 进行身份验证。

该过程类似于 Facebook 等其他身份验证提供商。为了将帐户与 Facebook 关联,您需要执行上述前三个步骤(与 Facebook auth 相关),但您需要调用“linkWithCredential”而不是“signInWithCredential”。如果一切顺利,现在用户将能够通过 Google 或 Facebook 对同一帐户进行身份验证。

如果您调用“signInWithCredential”,您将创建一个使用 Facebook 作为身份验证提供商的新帐户。因此,用户不是能够访问具有两个(或更多)身份验证提供程序的单个帐户,而是该用户将为每个身份验证提供程序拥有两个单独的帐户。这就是为什么 documentation说你应该跳过调用 FirebaseAuth.signInWith 方法。

关于您关于合并的问题,文档中提到:“如果凭据已链接到另一个用户帐户,则对 linkWithCredential 的调用将失败”。这意味着用户已经在授权提供商处拥有一个帐户。如果您希望用户访问两个帐户的信息,则需要创建逻辑以将信息从一个帐户合并到另一个帐户。

关于Android Firebase 将多个帐户提供商与匹配的电子邮件链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44125583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com