从 facebook LoginButton 的 registerCallback 方法获取错误的访问令牌

Getting wrong access token from registerCallback method of facebook LoginButton

我可以通过调用这个 signIn() 方法成功登录到 facebook。

private fun signIn() {
        loginBtn?.registerCallback(callBackManager,object: FacebookCallback<LoginResult>{
            override fun onSuccess(result: LoginResult?) {
                handleFacebookAccessToken(result!!.accessToken)
            }

            override fun onCancel() {

            }

            override fun onError(error: FacebookException?) {
                Log.d("MainActivity:", "onError "+error?.message)
            }

        })
    }

    private fun handleFacebookAccessToken(accessToken: AccessToken?) {
        val authCredential = FacebookAuthProvider.getCredential(accessToken!!.token)
        firebaseAuth?.signInWithCredential(authCredential)
            ?.addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d("MainActivity:", "signInWithCredential:success")
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w("dsds", "signInWithCredential:failure ", task.exception)
                    Toast.makeText(baseContext, "Authentication failed.",
                        Toast.LENGTH_SHORT).show()
                }
            }
    }

但我无法通过调用 handleFacebookAccessToken(accessToken: AccessToken?) 方法使用 firebase 进行身份验证以登录 firebase,因为它提供了无效的访问令牌。 如果我通过转到 Facebook 开发人员控制台中的应用程序手动从测试用户那里获取访​​问令牌,并且 在下面的 handleFacebookAccessToken(token: String?) 方法中对其进行硬编码,然后它就可以工作了。

private fun handleFacebookAccessToken(token: String?) {
        val authCredential = FacebookAuthProvider.getCredential(token)
        firebaseAuth?.signInWithCredential(authCredential)
            ?.addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d("MainActivity:", "signInWithCredential:success")
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w("dsds", "signInWithCredential:failure ", task.exception)
                    Toast.makeText(baseContext, "Authentication failed.",
                        Toast.LENGTH_SHORT).show()
                }
            }
    }

我在下面收到此异常。


com.google.firebase.auth.FirebaseAuthInvalidCredentialsException: The supplied auth credential is malformed or has expired. [ Remote site 5XX from facebook.com for VERIFY_CREDENTIAL ]
        at com.google.android.gms.internal.firebase-auth-api.zztt.zza(com.google.firebase:firebase-auth@@20.0.4:28)
        at com.google.android.gms.internal.firebase-auth-api.zzvb.zza(com.google.firebase:firebase-auth@@20.0.4:9)
        at com.google.android.gms.internal.firebase-auth-api.zzvc.zzk(com.google.firebase:firebase-auth@@20.0.4:1)
        at com.google.android.gms.internal.firebase-auth-api.zzuz.zzh(com.google.firebase:firebase-auth@@20.0.4:25)
        at com.google.android.gms.internal.firebase-auth-api.zztq.zzk(com.google.firebase:firebase-auth@@20.0.4:1)
        at com.google.android.gms.internal.firebase-auth-api.zzpr.zza(com.google.firebase:firebase-auth@@20.0.4:2)
        at com.google.android.gms.internal.firebase-auth-api.zzvg.zza(com.google.firebase:firebase-auth@@20.0.4:25)
        at com.google.android.gms.internal.firebase-auth-api.zzuq.zzd(com.google.firebase:firebase-auth@@20.0.4:4)
        at com.google.android.gms.internal.firebase-auth-api.zzpy.zzc(com.google.firebase:firebase-auth@@20.0.4:4)
        at com.google.android.gms.internal.firebase-auth-api.zztu.zzd(com.google.firebase:firebase-auth@@20.0.4:5)
        at com.google.android.gms.internal.firebase-auth-api.zzsg.zzd(com.google.firebase:firebase-auth@@20.0.4:3)
        at com.google.android.gms.internal.firebase-auth-api.zzsf.accept(Unknown Source:6)
        at com.google.android.gms.common.api.internal.zacj.doExecute(com.google.android.gms:play-services-base@@17.1.0:2)
        at com.google.android.gms.common.api.internal.zaf.zac(com.google.android.gms:play-services-base@@17.1.0:6)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zac(com.google.android.gms:play-services-base@@17.1.0:167)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zab(com.google.android.gms:play-services-base@@17.1.0:139)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(com.google.android.gms:play-services-base@@17.1.0:105)
        at com.google.android.gms.common.api.internal.GoogleApiManager.handleMessage(com.google.android.gms:play-services-base@@17.1.0:145)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at com.google.android.gms.internal.base.zar.dispatchMessage(com.google.android.gms:play-services-base@@17.1.0:8)
        at android.os.Looper.loop(Looper.java:224)
        at android.os.HandlerThread.run(HandlerThread.java:67)

登录https://developers.facebook.com/apps/

Select 应用并确认应用类型是消费者

解决方案参考自https://github.com/FirebaseExtended/flutterfire/issues/4524#issuecomment-764610739