Integracja Logowania przez Google z aplikacją na Androida

Aby zintegrować Logowanie przez Google z aplikacją na Androida, skonfiguruj ją i dodaj do układu aplikacji przycisk, który rozpocznie proces logowania.

Zanim zaczniesz

Skonfiguruj projekt Konsoli interfejsów API Google i skonfiguruj projekt Android Studio.

Konfigurowanie logowania przez Google i obiektu GoogleSignInClient

  1. W metodzie onCreate aktywności logowania skonfiguruj Logowanie przez Google, aby zażądać danych użytkownika wymaganych przez Twoją aplikację. Aby na przykład skonfigurować Logowanie przez Google tak, aby prosiło o identyfikator i podstawowe informacje o profilu, utwórz obiekt GoogleSignInOptions z parametrem DEFAULT_SIGN_IN. Aby poprosić też o adresy e-mail użytkowników, utwórz obiekt GoogleSignInOptions z opcją requestEmail.

    // Configure sign-in to request the user's ID, email address, and basic
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

    Jeśli chcesz poprosić o dodatkowe zakresy, aby uzyskać dostęp do interfejsów API Google, wskaż je za pomocą requestScopes. Ze względu na wygodę użytkowników podczas logowania się żądaj tylko zakresów, które są wymagane do działania aplikacji w minimalnym stopniu. Dodatkowe zakresy możesz wysyłać tylko wtedy, gdy są potrzebne, aby użytkownicy widzieli ekran zgody w kontekście wykonanych przez nich działań. Zobacz Zapotrzebowanie na dodatkowe zakresy.

  2. Następnie również w metodzie onCreate aktywności logowania utwórz obiekt GoogleSignInClient z określonymi opcjami.

    // Build a GoogleSignInClient with the options specified by gso.
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

Sprawdzanie, czy jest zalogowany użytkownik

W metodzie onStart aktywności sprawdź, czy użytkownik nie zalogował się już w Twojej aplikacji przez Google.

// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);

Jeśli GoogleSignIn.getLastSignedInAccount zwraca obiekt GoogleSignInAccount (a nie null), użytkownik zalogował się już w Twojej aplikacji przez Google. Zaktualizuj odpowiednio interfejs użytkownika, np. ukryj przycisk logowania, uruchom główną aktywność lub cokolwiek innego, co pasuje do aplikacji.

Jeśli GoogleSignIn.getLastSignedInAccount zwraca wartość null, użytkownik nie zalogował się jeszcze w aplikacji przez Google. Zaktualizuj interfejs tak, aby wyświetlał przycisk Logowanie przez Google.

Dodawanie przycisku logowania przez Google do aplikacji

  1. Standardowy przycisk logowania przez GoogleDodaj SignInButton w układzie aplikacji:

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  2. Opcjonalnie: jeśli używasz domyślnej grafiki przycisku logowania, zamiast udostępniać własne zasoby przycisku logowania, możesz dostosować rozmiar przycisku za pomocą metody setSize.

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_STANDARD);
    
  3. W aktywności Androida (np. w metodzie onCreate) zarejestruj OnClickListener przycisku, aby zalogować użytkownika po kliknięciu:

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

Rozpocznij proces logowania

  1. Obraz okna wyboru kontaW metodzie onClick aktywności możesz przetwarzać kliknięcia przycisków logowania, tworząc intencję logowania za pomocą metody getSignInIntent i uruchamiając intencję od startActivityForResult.

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sign_in_button:
                signIn();
                break;
            // ...
        }
    }
    
    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    Uruchomienie intencji prosi użytkownika o wybranie konta Google, za pomocą którego chce się zalogować. Jeśli poprosisz o zakresy wykraczające poza profile, email i openid, użytkownik zostanie też poproszony o przyznanie dostępu do żądanych zasobów.

  2. Gdy użytkownik się zaloguje, możesz pobrać dla niego obiekt GoogleSignInAccount w metodzie onActivityResult aktywności.

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

    Obiekt GoogleSignInAccount zawiera informacje o zalogowanym użytkowniku, takie jak jego nazwa.

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
    
            // Signed in successfully, show authenticated UI.
            updateUI(account);
        } catch (ApiException e) {
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    Możesz też uzyskać adres e-mail użytkownika za pomocą getEmail, identyfikator Google użytkownika (do użytku po stronie klienta) – getId, a także token identyfikatora użytkownika – getIdToken. Jeśli musisz przekazać aktualnie zalogowanego użytkownika na serwer backendu, wyślij token identyfikatora na serwer backendu i zweryfikuj go na serwerze.