我的 Android 应用程序使用 Google 登录进行 Firebase 身份验证时遇到问题。身份验证过程正常工作,但用户数据未按预期写入 Firebase 实时数据库。
我已确保 Firebase 实时数据库规则在用户经过身份验证时允许读取和写入操作。这是我目前的规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
尽管如此,当用户成功登录 Google 时,应用程序会记录正确的用户信息,但数据不会反映在 Firebase 实时数据库中。
以下是相关代码片段:
public class SignInActivity extends AppCompatActivity {
private SignInViewModel signInViewModel;
private FirebaseAuth auth = FirebaseAuth.getInstance();
private ActivitySignInBinding binding;
private SignInClickHandler clickHandler;
private Button googleSignInBtn;
private GoogleSignInOptions gso;
private GoogleSignInClient gsc;
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private int RC_SIGN_IN = 20;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
binding = DataBindingUtil.setContentView(this, R.layout.activity_sign_in);
signInViewModel = new ViewModelProvider(this).get(SignInViewModel.class);
clickHandler = new SignInClickHandler(this, signInViewModel);
binding.setClickHandler(clickHandler);
googleSignInBtn = binding.googleLogInButton;
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().
requestIdToken(getString(R.string.default_web_client_id))
.requestEmail().build();
gsc = GoogleSignIn.getClient(this, gso);
googleSignInBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
googleSignIn();
}
});
}
private void googleSignIn() {
Intent signInIntent = gsc.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN){
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
firebaseAuth(account.getIdToken());
} catch (ApiException e) {
Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
private void firebaseAuth(String idToken) {
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
auth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = auth.getCurrentUser();
Map<String, Object> map = new HashMap<>();
map.put("id", user.getUid());
map.put("name", user.getDisplayName());
String photoUrl = (user.getPhotoUrl() != null) ? user.getPhotoUrl().toString() : "";
map.put("profile", photoUrl);
Log.d("FirebaseGoogleAuth", "id" + user.getUid() + " " + user.getDisplayName() + " " + photoUrl);
database.getReference()
.child("users")
.child(user.getUid())
.setValue(map)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Log.d("FirebaseGoogleAuth", "Data write successful");
Intent intent = new Intent(getApplicationContext(), FeedActivity.class);
startActivity(intent);
finish();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("FirebaseGoogleAuth", "error realtime database " + e.getMessage().toString());
}
});
} else {
Toast.makeText(SignInActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onStart() {
super.onStart();
FirebaseUser currentUser = auth.getCurrentUser();
if (currentUser != null){
startActivity(new Intent(SignInActivity.this, FeedActivity.class));
finish();
}
}
}
构建 Gradle(应用程序级别):
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
android {
namespace 'com.arsoftltd.lolipop'
compileSdk 34
defaultConfig {
applicationId "com.arsoftltd.lolipop"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildFeatures{
dataBinding true
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.10.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
// Import the Firebase BoM
implementation platform('com.google.firebase:firebase-bom:32.6.0')
// When using the BoM, don't specify versions in Firebase dependencies
implementation 'com.google.firebase:firebase-analytics'
// Firebase Authentication
implementation 'com.google.firebase:firebase-auth'
implementation "com.google.android.gms:play-services-auth:20.7.0"
implementation 'com.firebaseui:firebase-ui-auth:8.0.2'
// Firebase realtime database
implementation "com.google.firebase:firebase-database"
// Facebook Sdk
implementation 'com.facebook.android:facebook-android-sdk:[8,9)'
// SSP SDP library
implementation 'com.intuit.ssp:ssp-android:1.1.0'
implementation 'com.intuit.sdp:sdp-android:1.1.0'
}
认证过程中日志输出显示正确的用户信息:
2023-11-27 17:17:59.062 28378-28378 FirebaseGoogleAuth com.arsoftltd.lolipop D idpuhGxZmHw7YfW49R4ZGfHJsLmus2 Md Abu Rayhan https://lh3.googleusercontent.com/a/ACg8ocIujr5T5CNmjjEps2SKElmg5ROz0Qbdl0cNcfPAUwcnvQ=s96-c
我将不胜感激任何关于为什么尽管身份验证成功但用户数据没有写入 Firebase 实时数据库的见解或建议。预先感谢您!
由于
onComplete
或 onFailure
日志均未写入,很可能您的应用程序未连接到数据库。当您在创建数据库之前下载 google-services.json
文件时,可能会发生这种情况。
解决此问题的方法是重新下载
google-services.json
并将应用程序中的版本替换为最新版本。
解决该问题的另一种方法是在获取
FirebaseDatabase
实例时在代码中指定数据库的 URL:
private FirebaseDatabase database = FirebaseDatabase.getInstance("your database URL here");
另请参阅: