Аутентификация в Firebase с помощью Google Play Games - PullRequest
1 голос
/ 16 июня 2019

Я создаю игру для Android.Каждый пользователь должен пройти аутентификацию.

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

Есть ли способ, как сгенерировать что-то вроде идентификационного кода, который является уникальным ивсегда одинаково для одного игрока, использующего метод авторизации в играх Firebase Play?

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
                .requestServerAuthCode("MyCID")
                .build();

        mAuth = FirebaseAuth.getInstance();
        super.onCreate(savedInstanceState);
        final FirebaseAuth auth = FirebaseAuth.getInstance();
        AuthCredential credential = PlayGamesAuthProvider.getCredential("MyCID");
        auth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            currentUser = auth.getCurrentUser();
                        } else {
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });
        if (currentUser == null) {
            cu = "NO UID";
        } else {
            cu = currentUser.getUid();
        }

Я пробовал этот код (где MyCID: я использовал CID из рисунка ниже), но всплывающее окно в Google Play Games отсутствуетпоказано, что я получаю тост «Сбой аутентификации», и для cu задано «NO UID».

MyCID

Может кто-нибудь объяснить, как это работает, пожалуйста?


РЕДАКТИРОВАТЬ

Благодаря @crysxd мое приложение теперь отображает зеленое всплывающее окно Google Play.Но вместо ожидаемого всплывающего окна «Выберите учетную запись», как я вижу в других играх, в которых используется вход в игры Google, я получаю сообщение об ошибке «com.google.android.gms.common.api.ApiException: 4:».

Есть ли функция, которую мне нужно запустить, чтобы показать это диалоговое окно?Я что-то упустил или просто неправильно настроил игру в игровой консоли Google?

Мой текущий код: ссылка

1 Ответ

2 голосов
/ 16 июня 2019

Вы пропускаете важный шаг здесь.Документы Firebase обычно очень хороши, но вход в Play плохо описан.

Вы правильно сделали первый шаг: вам нужно настроить GoogleSignInOptions, но вы пропустите, чтобы передать их в GoogleSignInClient.

  • Создать клиента в onCreate:

    private static final int RC_SIGN_IN = 543;
    private GoogleSignInClient mGoogleSignInClient;
    
    public void onCreate(Bundle savedInstancestate) {
        super.onCreate(savedInstancestate)
    
        // ...
    
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
                .requestServerAuthCode("MyCID")
                .build();
    
        mGoogleSignInClient= GoogleSignIn.getClient(this, gso)
    }
    
  • Вызовите этот метод, когда нажата кнопка входа или вы хотите запуститьвойдите в систему. Это приведет к отображению диалогового окна входа в систему.

    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }
    
  • Получите ответный знак и обработайте его

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from 
        GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                firebaseAuthWithGoogle(account);
            } catch (ApiException e) {
                // Google Sign In failed, update UI appropriately
                Log.w(TAG, "Google sign in failed", e);
            }
        }
    }
    
  • Наконец, ваш код вступает в игру.Теперь у нас есть GoogleSignInAccount, который требуется для вызова PlayGamesAuthProvider.getCredential(...).Вы передали здесь свой идентификатор клиента, но это не так.Вот как это работает: вы передаете свой идентификатор клиента в Google, чтобы сообщить им, кто вы (или какое приложение).Они позволят пользователю войти в систему и предоставят вам специальный токен («id token»), который затем может использовать Firebase для получения информации о пользователе из Google Play Games.И вот что вам нужно дать Firebase здесь:

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
    
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        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());
                        Snackbar.make(findViewById(R.id.main_layout), "Authentication Failed.", Snackbar.LENGTH_SHORT).show();
                        updateUI(null);
                    }
    
                    // ...
                }
            });
    }
    

Надеюсь, что это поможет!Вы можете найти весь код, указанный в документах здесь и здесь (это файлы, из которых они показывают фрагменты в документах).

...