使用 Google 登录的 Firebase 身份验证未将数据写入实时数据库

问题描述 投票:0回答:1

我的 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 实时数据库的见解或建议。预先感谢您!

java android firebase firebase-realtime-database firebase-authentication
1个回答
0
投票

由于

onComplete
onFailure
日志均未写入,很可能您的应用程序未连接到数据库。当您在创建数据库之前下载
google-services.json
文件时,可能会发生这种情况。

解决此问题的方法是重新下载

google-services.json
并将应用程序中的版本替换为最新版本。

解决该问题的另一种方法是在获取

FirebaseDatabase
实例时在代码中指定数据库的 URL:

private FirebaseDatabase database = FirebaseDatabase.getInstance("your database URL here");

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.