如果我在Firebase身份验证中使用Facebook登录,为什么我的currentUser始终为null?

时间:2020-01-11 11:19:19

标签: android facebook firebase kotlin firebase-authentication

在登录页面中,我在下面使用这两个代码:

    facebookLoginButton.setOnClickListener {
          facebookLoginManager.logInWithReadPermissions(this, Arrays.asList("email", "public_profile"))
    }

    private fun setUpFacebookLogin() {

        facebookLoginManager.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {

            override fun onSuccess(loginResult: LoginResult) {
                Log.d(TAG, "facebook:onSuccess:$loginResult")
                handleFacebookAccessToken(loginResult.accessToken)
            }

            override fun onCancel() {
                Log.d(TAG, "facebook:onCancel")
                progressBar.visibility = View.GONE

            }

            override fun onError(error: FacebookException) {
                Log.d(TAG, "facebook:onError", error)
                progressBar.visibility = View.GONE
                mActivity.longToast("Gagal masuk dengan akun Facebook, silahkan periksa koneksi internet Anda, atau gunakan akun Google atau email yang lain.")

            }
        })

    }

    private fun handleFacebookAccessToken(token: AccessToken) {

        Log.d(TAG, "handleFacebookAccessToken:$token")

        val credential = FacebookAuthProvider.getCredential(token.token)

        auth.signInWithCredential(credential).addOnSuccessListener {

            Log.d(TAG, "facebook signInWithCredential:success")

            val user = auth.currentUser ?: return@addOnSuccessListener
            checkUserBasicDataInFirestore(user)

        }.addOnFailureListener {exception ->

            progressBar.visibility = View.GONE
            Log.d(TAG, "facebook signInWithCredential failed: ${exception.localizedMessage}")
            mActivity.longToast(exception.localizedMessage)
        }


    }

我实际上可以使用这些代码将用户注册为firebase auth,但是尝试使用Facebook登录时遇到问题。 auth.signInWithCredential(credential).addOnSuccessListener实际上是被触发的,因此我认为我可以在登录页面中使用Facebook成功登录

但是在另一个屏幕(片段)中,当我想访问当前用户以获取uid时,它总是为null,就像这样

val userFirebaseAuth = FirebaseAuth.getInstance().currentUser

我不明白为什么userFirebaseAuth总是为null?

1 个答案:

答案 0 :(得分:0)

根据我的经验,从冷启动开始,当前用户并不总是立即可用。如果需要,Firebase身份验证可能需要一些时间来初始化和刷新用户的ID令牌。由于您不知道要花多长时间,因此您应该使用侦听器确定SDK绝对了解并验证了当前用户的第一个可能时刻。阅读以下内容是一个好主意:How does the firebase AuthStateListener work?

创建一个新的AuthStateListener:

mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // Sign in logic here.
            }
        }
    };

然后根据需要添加和删除它:

FirebaseAuth.getInstance().addAuthStateListener(mAuthListener);
FirebaseAuth.getInstance().removeAuthStateListener(mAuthListener);

还要签出API documentation on AuthStateListener

相关问题