java - 使用 Google 注册 Firebase 用户
问题描述
我正在尝试在我的应用中实现谷歌登录功能。我已遵循此文档,问题是 - 如果我使用以前使用的 google 帐户,它不会显示诸如“电子邮件已在此应用程序中注册”之类的错误。结果,该帐户之前存储的数据将被删除,并重新注册 google 帐户。这是我的代码:
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
int coins = 100;
String name, email;
name = user.getDisplayName();
email = user.getEmail();
//updateUI(user);
storeUserCredentials(name, email, coins);
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithCredential:failure", task.getException());
Toast.makeText(SignUpActivity.this, "Error : " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
public void storeUserCredentials(String name, String email, int coins){
progressBar.setVisibility(View.VISIBLE);
User user = new User(name, email, coins);
mDatabase.getReference("Users")
.child(mAuth.getCurrentUser().getUid())
.setValue(user)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
progressBar.setVisibility(View.GONE);
if (task.isSuccessful()){
Toast.makeText(SignUpActivity.this, "Registration Successful!", Toast.LENGTH_SHORT).show();
startActivity(new Intent(SignUpActivity.this, MainActivity.class));
finish();
} else {
if (task.getException() instanceof FirebaseAuthUserCollisionException){
Toast.makeText(SignUpActivity.this, "The email is already used", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(SignUpActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
});
}
我的代码有什么问题,请解释一下。
解决方案
当你调用signInWithCredential
SDK时返回一个用户登录成功完成的任务。由于你storeUserCredentials
在那个条件下调用,所以每次用户登录时都会调用它。这实际上是一个很正常的流程。
如果要检测此帐户是否是 Firebase 身份验证的新帐户,可以检查用户的创建时间。请参阅Firebase 身份验证,如何知道新用户已注册,而不是现有用户登录?
如果你想检测你之前是否已经见过这个用户,你需要在调用之前检查数据库storeUserCredentials
。但是您现在拥有的是一个非常惯用的流程,例如,它可以确保您在每次要求用户登录时存储最新的显示名称。
推荐阅读
- java - Gradle Kotlin DSL:找不到或加载主类
- android - Android Room - 每个应用程序一个或多个实例?
- sql - 组匹配值并查找哪些缺少相关值?
- java - 是否可以选择底部导航项的圆形背景?
- flask-admin - Flask-Admin 在提交表单时发送电子邮件
- jmeter - Blazemeter 因 jmx 文件而崩溃
- azure-devops - Azure DevOps 查询依赖项
- java - 检查属性是否等于字符串值列表
- javascript - 在 TS 中比较两个具有指定键的对象
- python - 如何在Python中提取具有多列条件的行