Использование AccessToken для получения пользователя Firebase, вызывающего ошибку Firebase с аутентификацией Facebook: «Неудачный ответ debug_token от Facebook» Код 190 - PullRequest
0 голосов
/ 19 ноября 2018

Настройка аутентификации Facebook с помощью Firebase на Android и получение следующей неприятной ошибки:

com.google.firebase.FirebaseException: An internal error has occurred. [ Unsuccessful debug_token response from Facebook:{"error":{"message":"Invalid OAuth access token signature.","type":"OAuthException","code":190,"fbtrace_id":"BLR\/UAx2fzn"}} ]

Моя цель - не избавиться от этой ошибки, она должна получить информацию о пользователе из Firebase,На данный момент, хотя мне кажется, что я могу получить ненулевой токен с истекшим сроком действия, в моей консоли Firebase нет записи для пользователя Facebook.IOW, как я могу заставить эту строку работать без сбоев?

-> mAuth.signInWithCredential(credential)

Чтобы воспроизвести, я запускаю приложение с нуля (вышла из системы) и перехожу к моей функции LoginActivity.Я выбираю Продолжить с Facebook LoginButton и выбираю Продолжить .В настоящее время у меня есть логика моего приложения, поэтому после успешного обратного вызова оно остается в LoginActivity, и я получаю сообщение об ошибке, описанное выше.

LoginActivity.java

package com.***.datingapp.activities;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FacebookAuthProvider;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.***.datingapp.R;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "Login";

    private EditText loginEmailEditText;
    private EditText loginPasswordEditText;
    private TextView loginStatusTextView;
    private TextView loginDetailTextView;
    private Button loginEmailButton;
    private Button loginRegisterButton;
    private LoginButton loginFacebookButton;
    private Button loginFacebookLogoutButton;

    private FirebaseAuth mAuth;
    private CallbackManager callbackManager;
    private FacebookCallback<LoginResult> facebookCallback;

    private static final int RC_SIGN_IN = 123;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        mAuth = FirebaseAuth.getInstance();
        callbackManager = CallbackManager.Factory.create();

        loginEmailEditText = (EditText) findViewById(R.id.edit_text_login_email);
        loginPasswordEditText = (EditText) findViewById(R.id.edit_text_login_password);
        loginStatusTextView = (TextView) findViewById(R.id.text_view_login_status);
        loginDetailTextView = (TextView) findViewById(R.id.text_view_login_details);
        loginEmailButton = (Button) findViewById(R.id.button_login_email);
        loginRegisterButton = (Button) findViewById(R.id.button_login_email_register);
        loginFacebookButton = (LoginButton) findViewById(R.id.buttonFacebookLogin);
        loginFacebookLogoutButton = (Button) findViewById(R.id.buttonFacebookSignout);

        loginEmailButton.setOnClickListener(this);
        loginRegisterButton.setOnClickListener(this);
        loginFacebookLogoutButton.setOnClickListener(this);

        loginFacebookButton.setReadPermissions("email", "public_profile");
        facebookCallback = new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d(TAG, "facebook:onSuccess:" + loginResult + " - " + loginResult.getAccessToken().getToken());
                handleFacebookAccessToken(loginResult.getAccessToken());
            }

            @Override
            public void onCancel() {
                Log.d(TAG, "facebook:onCancel");
                updateUI(null);
            }

            @Override
            public void onError(FacebookException error) {
                Log.d(TAG, "facebook:onError", error);
                updateUI(null);
            }
        };
        loginFacebookButton.registerCallback(callbackManager, facebookCallback);
        LoginManager.getInstance().registerCallback(callbackManager, facebookCallback);
    }

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.

        AccessToken fbAccessToken = AccessToken.getCurrentAccessToken();
        if (fbAccessToken != null && fbAccessToken.isExpired())
            handleFacebookAccessToken(fbAccessToken);
        else {
            FirebaseUser currentUser = mAuth.getCurrentUser();
            updateUI(currentUser);
        }

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_login_email:
                if (loginEmailButton.getText().toString().equals(getText(R.string.login_activity_sign_in)))
                    signIn(loginEmailEditText.getText().toString(), loginPasswordEditText.getText().toString());
                else
                    signOut();
                break;
            case R.id.button_login_email_register:
                createAccount(loginEmailEditText.getText().toString(), loginPasswordEditText.getText().toString());
                break;
            case R.id.buttonFacebookSignout:
                signOut();
        }
    }

    private boolean validateForm() {
        boolean valid = true;

        String email = loginEmailEditText.getText().toString();
        if (TextUtils.isEmpty(email)) {
            loginEmailEditText.setError("Required.");
            valid = false;
        } else {
            loginEmailEditText.setError(null);
        }

        String password = loginPasswordEditText.getText().toString();
        if (TextUtils.isEmpty(password)) {
            loginPasswordEditText.setError("Required.");
            valid = false;
        } else {
            loginPasswordEditText.setError(null);
        }

        return valid;
    }

    private void signIn(String email, String password) {
        Log.d(TAG, "signIn:" + email);
        if (!validateForm())
            return;
        mAuth.signInWithEmailAndPassword(email, password)
                .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, "signInWithEmail:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithEmail:failure", task.getException());
                            Toast.makeText(LoginActivity.this, task.getException().getMessage(),
                                    Toast.LENGTH_SHORT).show();
                            updateUI(null);
                        }

                        if (!task.isSuccessful()) {
                            loginStatusTextView.setText(R.string.login_activity_status_auth_failed);
                        }
                    }
                });
    }

    private void createAccount(String email, String password) {
        Log.d(TAG, "createAccount:" + email);
        if (!validateForm())
            return;
        mAuth.createUserWithEmailAndPassword(email, password)
                .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, "createUserWithEmail:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "createUserWithEmail:failure", task.getException());
                            Toast.makeText(LoginActivity.this, task.getException().getMessage(),
                                    Toast.LENGTH_SHORT).show();
                            updateUI(null);
                        }
                    }
                });
    }

    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(LoginActivity.this, task.getException().getMessage(),
                                    Toast.LENGTH_LONG).show();
                            signOut();
                        }
                    }
                });
    }

    @Override
    protected void onResume() {
        super.onResume();
//        Toast.makeText(LoginActivity.this, "Resuming.",
//                Toast.LENGTH_SHORT).show();
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    public void signOut() {
        mAuth.signOut();
        LoginManager.getInstance().logOut();
        FirebaseAuth.getInstance().signOut();
        updateUI(null);
    }

    private void updateUI(FirebaseUser user) {
        if (user != null) {
            loginStatusTextView.setText(getString(R.string.emailpassword_status_format,
                    user.getEmail(), user.isEmailVerified()));
            loginDetailTextView.setText(getString(R.string.firebase_status_format, user.getUid()));
            loginEmailButton.setText(getText(R.string.login_activity_sign_out));
            loginFacebookButton.setVisibility(View.INVISIBLE);
            loginFacebookLogoutButton.setVisibility(View.VISIBLE);
        } else {
            loginStatusTextView.setText(R.string.login_activity_status_signed_out);
            loginDetailTextView.setText(null);
            loginEmailButton.setText(getText(R.string.login_activity_sign_in));
            loginFacebookButton.setVisibility(View.VISIBLE);
            loginFacebookLogoutButton.setVisibility(View.INVISIBLE);
        }
    }

}

Я заметил, что когда я включаю строку handleFacebookAccessToken(loginResult.getAccessToken()); в обратный вызов, я получаю сообщение об ошибке, но в противном случае я не получаю«т.Но исключение строки не кажется постоянным решением, потому что как я могу тогда получить информацию о пользователе?

  • Я настроил все, что связано с идентификатором приложения и секретом приложения.
  • Я настроил параметры своего приложения Facebook настолько точно, насколько смогу собрать.
  • Я включил необходимый метатег в свой манифест.

1 Ответ

0 голосов
/ 20 ноября 2018

Я решил эту проблему:

(барабанная дробь, пожалуйста)

Удаление моего приложения Facebook через Консоль разработчика Facebook и создание нового идентичного приложения . Затем я скопировал идентификатор приложения и секрет в Firebase Console auth для входа в Facebook, обновил свой манифест и вуаля, это сработало.

Я не отмечаю это решение как «правильный» ответ, потому что оно не «решило проблему». Я просто сбивался с интуиции, что это было FirebaseException (внутренняя ошибка) после того, как я уже дважды, трижды, четыре раза проверил все настройки и код конфигурации моего приложения Facebook.

...