在android中通过firebase进行Facebook登录时身份验证失败

Posted

技术标签:

【中文标题】在android中通过firebase进行Facebook登录时身份验证失败【英文标题】:Authentication failed when doing Facebook login through firebase in android 【发布时间】:2019-03-10 11:23:10 【问题描述】:

我正在开发一个应用程序,我可以在其中为用户提供通过 facebook 登录的选项。现在,我为此使用firebase,每当我尝试登录时都会收到身份验证失败消息。它正在进行下一个活动,但它显示“身份验证失败”消息。 这是我的代码。这是我的主要活动:-

public class MainActivity extends AppCompatActivity 

private CallbackManager mCallbackManager;
private FirebaseAuth firebaseAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private TextView txtUser;
private TextView txtEmail;
private ImageView imgProfile;
private LoginButton logoutButton;
private LoginButton loginButton;
private static final String TAG = "MainActivity";
private FirebaseAuth mAuth;
PackageInfo info;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    AppEventsLogger.activateApp(this);
    setContentView(R.layout.activity_main);

    mAuth = FirebaseAuth.getInstance();

    // Initialize Facebook Login button
    mCallbackManager = CallbackManager.Factory.create();
    LoginButton loginButton = findViewById(R.id.login_button);
    loginButton.setReadPermissions("email", "public_profile");
    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() 
        @Override
        public void onSuccess(LoginResult loginResult) 
            Log.d(TAG, "facebook:onSuccess:" + loginResult);
            handleFacebookAccessToken(loginResult.getAccessToken());
        

        @Override
        public void onCancel() 
            Log.d(TAG, "facebook:onCancel");
            // ...
        

        @Override
        public void onError(FacebookException error) 
            Log.d(TAG, "facebook:onError", error);
            // ...
        
    );




@Override
public void onStart() 
    super.onStart();
    // Check if user is signed in (non-null) and update UI accordingly.
    FirebaseUser currentUser = mAuth.getCurrentUser();
    if(currentUser!=null)
        updateUI(currentUser);
    



private void updateUI(FirebaseUser currentUser) 

    Toast.makeText(MainActivity.this,"Done",Toast.LENGTH_SHORT);
    Intent intent = new Intent(MainActivity.this,AccountActivity.class);
    startActivity(intent);
    finish();


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    // Pass the activity result back to the Facebook SDK
    mCallbackManager.onActivityResult(requestCode, resultCode, data);

private void handleFacebookAccessToken(AccessToken token) 
    Log.d(TAG, "handleFacebookAccessToken:" + token);

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    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();
                        updateUI(user);
                     else 
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    

                    // ...
                
            );


现在,我使用以下方法获得了哈希键:-

      try 
        PackageInfo info = getPackageManager().getPackageInfo(
                getPackageName(),
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) 
            MessageDigest messageDigest = MessageDigest.getInstance("SHA");
            messageDigest.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(messageDigest.digest(), Base64.DEFAULT));
        
    
    catch (PackageManager.NameNotFoundException e) 

    
    catch (NoSuchAlgorithmException e) 

    

并将其放在我的 fb 开发者控制台中。它仍然显示此错误。可以请任何人解释我在这里做错了什么吗?

当我检查 logcat 时,此处显示消息:-“发生内部错误。[API 密钥无效。请传递有效的 API 密钥”。 我什至不知道这个 API 密钥是在哪里使用的。请帮忙。谢谢

【问题讨论】:

【参考方案1】:

在登录 firebase 之前有一个步骤,您必须在 firebase 控制台上注册您的应用。我没有那样做。 我做了一个新项目,跟随 firebase 的每一步。而且我现在没有收到任何错误。

【讨论】:

以上是关于在android中通过firebase进行Facebook登录时身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章

@Font-Face 不会在 IE 中通过 https 加载

在 Firebase 中通过电子邮件查找 UID

在 Firebase 云功能中通过 nodemailer 发送邮件是不是需要计费帐户?

在android中通过蓝牙进行多连接

如何在swift ios中通过键值读取子数据或过滤firebase数据

在 Android 中通过 Hilt 进行依赖项注入