Uwierzytelniaj przy użyciu Yahoo na Androidzie

Możesz umożliwić użytkownikom uwierzytelnianie się w Firebase za pomocą dostawców OAuth, takich jak Yahoo, integrując w aplikacji ogólne logowanie OAuth oparte na internecie za pomocą pakietu SDK Firebase, aby przeprowadzić cały proces logowania.

Zanim zaczniesz

Aby logować użytkowników za pomocą kont Yahoo, musisz najpierw włączyć Yahoo jako dostawcę logowania w projekcie w Firebase:

  1. Dodaj Firebase do projektu aplikacji na Androida.

  2. W konsoli Firebase kliknij Zabezpieczenia > Uwierzytelnianie.
  3. Na karcie Metoda logowania włącz dostawcę logowania Yahoo.
  4. Dodaj identyfikator klienta i tajny klucz klienta z konsoli dewelopera tego dostawcy do konfiguracji dostawcy:
    1. Aby zarejestrować klienta OAuth Yahoo, postępuj zgodnie z dokumentacją dla deweloperów Yahoo dotyczącą rejestrowania aplikacji internetowej w Yahoo.

      Pamiętaj, aby wybrać 2 uprawnienia interfejsu OpenID Connect API: profile i email.

    2. Podczas rejestrowania aplikacji u tych dostawców zarejestruj domenę dla swojego projektu jako domenę przekierowania dla aplikacji.*.firebaseapp.com
  5. Kliknij Zapisz.
  6. Jeśli jeszcze tego nie zrobisz, określ odcisk cyfrowy SHA-1 aplikacji.

    1. W konsoli Firebase otwórz kartę Ustawienia > Ogólne.

    2. Przewiń w dół do karty Twoje aplikacje , wybierz aplikację na Androida i dodaj odcisk cyfrowy SHA-1 w polu Odciski cyfrowe certyfikatu SHA.

    Szczegółowe informacje o tym, jak uzyskać odcisk cyfrowy SHA aplikacji, znajdziesz w artykule Uwierzytelnianie klienta.

Obsługa procesu logowania za pomocą pakietu SDK Firebase

Jeśli tworzysz aplikację na Androida, najłatwiejszym sposobem uwierzytelniania użytkowników w Firebase za pomocą ich kont Yahoo jest obsługa całego procesu logowania za pomocą pakietu Firebase Android SDK.

Aby obsługiwać proces logowania za pomocą pakietu Firebase Android SDK, wykonaj te czynności:

  1. Utwórz instancję OAuthProvider za pomocą jej Buildera z identyfikatorem dostawcy yahoo.com.

    Kotlin

    val provider = OAuthProvider.newBuilder("yahoo.com")

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("yahoo.com");

  2. Opcjonalnie: określ dodatkowe niestandardowe parametry OAuth, które chcesz wysłać z żądaniem OAuth.

    Kotlin

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login")
    
    // Localize to French.
    provider.addCustomParameter("language", "fr")

    Java

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login");
    
    // Localize to French.
    provider.addCustomParameter("language", "fr");

    Informacje o parametrach obsługiwanych przez Yahoo znajdziesz w dokumentacji OAuth Yahoo. Pamiętaj, że nie możesz przekazywać parametrów wymaganych przez Firebase za pomocą setCustomParameters(). Są to parametry client_id, redirect_uri, response_type, scope i state.

  3. Opcjonalnie: określ dodatkowe zakresy protokołu OAuth 2.0 poza profile i email, o które chcesz poprosić dostawcę uwierzytelniania. Jeśli Twoja aplikacja wymaga dostępu do prywatnych danych użytkownika z interfejsów API Yahoo, musisz poprosić o uprawnienia do interfejsów API Yahoo w sekcji Uprawnienia interfejsu API w konsoli dewelopera Yahoo. Żądane zakresy OAuth muszą dokładnie odpowiadać zakresom wstępnie skonfigurowanym w uprawnieniach interfejsu API aplikacji. Jeśli na przykład wymagany jest dostęp do odczytu i zapisu kontaktów użytkownika, a w uprawnieniach interfejsu API aplikacji jest wstępnie skonfigurowany, zamiast zakresu OAuth tylko do odczytu sdct-r należy przekazać sdct-w. W przeciwnym razie proces się nie powiedzie,a użytkownik zobaczy komunikat o błędzie.

    Kotlin

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = listOf("mail-r", "sdct-w")

    Java

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    List<String> scopes =
            new ArrayList<String>() {
                {
                    // Request access to Yahoo Mail API.
                    add("mail-r");
                    // This must be preconfigured in the app's API permissions.
                    add("sdct-w");
                }
            };
    provider.setScopes(scopes);
    Więcej informacji znajdziesz w dokumentacji zakresów Yahoo.

  4. Uwierzytelnij się w Firebase za pomocą obiektu dostawcy OAuth. Pamiętaj, że w przeciwieństwie do innych operacji FirebaseAuth ta operacja przejmie kontrolę nad interfejsem użytkownika, wyświetlając kartę Niestandardowa karta Chrome. W związku z tym nie odwołuj się do swojej aktywności w OnSuccessListeners i OnFailureListeners, które dołączasz, ponieważ zostaną one natychmiast odłączone, gdy operacja uruchomi interfejs użytkownika.

    Najpierw sprawdź, czy już otrzymałeś odpowiedź. Logowanie za pomocą tej metody powoduje przejście aktywności do trybu działania w tle, co oznacza, że system może ją odzyskać podczas procesu logowania. Aby uniknąć sytuacji, w której użytkownik musi ponownie spróbować, sprawdź, czy wynik jest już dostępny.

    Aby sprawdzić, czy jest oczekujący wynik, wywołaj getPendingAuthResult:

    Kotlin

    val pendingResultTask = firebaseAuth.pendingAuthResult
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
            .addOnSuccessListener {
                // User is signed in.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                // The OAuth secret can be retrieved by calling:
                // ((OAuthCredential)authResult.getCredential()).getSecret().
            }
            .addOnFailureListener {
                // Handle failure.
            }
    } else {
        // There's no pending result so you need to start the sign-in flow.
        // See below.
    }

    Java

    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
                .addOnSuccessListener(
                        new OnSuccessListener<AuthResult>() {
                            @Override
                            public void onSuccess(AuthResult authResult) {
                                // User is signed in.
                                // IdP data available in
                                // authResult.getAdditionalUserInfo().getProfile().
                                // The OAuth access token can also be retrieved:
                                // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                                // The OAuth secret can be retrieved by calling:
                                // ((OAuthCredential)authResult.getCredential()).getSecret().
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                // Handle failure.
                            }
                        });
    } else {
        // There's no pending result so you need to start the sign-in flow.
        // See below.
    }

    Aby rozpocząć proces logowania, wywołaj startActivityForSignInWithProvider:

    Kotlin

    firebaseAuth
        .startActivityForSignInWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // User is signed in.
            // IdP data available in
            // authResult.getAdditionalUserInfo().getProfile().
            // The OAuth access token can also be retrieved:
            // ((OAuthCredential)authResult.getCredential()).getAccessToken().
            // The OAuth secret can be retrieved by calling:
            // ((OAuthCredential)authResult.getCredential()).getSecret().
        }
        .addOnFailureListener {
            // Handle failure.
        }

    Java

    firebaseAuth
            .startActivityForSignInWithProvider(/* activity= */ this, provider.build())
            .addOnSuccessListener(
                    new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            // User is signed in.
                            // IdP data available in
                            // authResult.getAdditionalUserInfo().getProfile().
                            // The OAuth access token can also be retrieved:
                            // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                            // The OAuth secret can be retrieved by calling:
                            // ((OAuthCredential)authResult.getCredential()).getSecret().
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // Handle failure.
                        }
                    });

    Po pomyślnym zakończeniu token dostępu protokołu OAuth powiązany z dostawcą można pobrać z zwróconego obiektu OAuthCredential.

    Za pomocą tokena dostępu OAuth możesz wywołać interfejs Yahoo API.

    Gdzie YAHOO_USER_UID to identyfikator użytkownika Yahoo, który można przeanalizować z pola firebaseAuth.getCurrentUser().getProviderData().get(0).getUid() lub z authResult.getAdditionalUserInfo().getProfile().

  5. Powyższe przykłady koncentrują się na procesach logowania, ale możesz też połączyć dostawcę Yahoo z istniejącym użytkownikiem za pomocą startActivityForLinkWithProvider. Możesz na przykład połączyć wielu dostawców z tym samym użytkownikiem, co pozwoli mu logować się za pomocą dowolnego z nich.

    Kotlin

    // The user is already signed-in.
    val firebaseUser = firebaseAuth.currentUser!!
    firebaseUser
        .startActivityForLinkWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // Provider credential is linked to the current user.
            // IdP data available in
            // authResult.getAdditionalUserInfo().getProfile().
            // The OAuth access token can also be retrieved:
            // authResult.getCredential().getAccessToken().
            // The OAuth secret can be retrieved by calling:
            // authResult.getCredential().getSecret().
        }
        .addOnFailureListener {
            // Handle failure.
        }

    Java

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
            .startActivityForLinkWithProvider(/* activity= */ this, provider.build())
            .addOnSuccessListener(
                    new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            // Provider credential is linked to the current user.
                            // IdP data available in
                            // authResult.getAdditionalUserInfo().getProfile().
                            // The OAuth access token can also be retrieved:
                            // authResult.getCredential().getAccessToken().
                            // The OAuth secret can be retrieved by calling:
                            // authResult.getCredential().getSecret().
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // Handle failure.
                        }
                    });

  6. Tego samego wzorca można użyć w przypadku startActivityForReauthenticateWithProvider, który umożliwia pobieranie nowych danych logowania do operacji wymagających niedawnego logowania.

    Kotlin

    // The user is already signed-in.
    val firebaseUser = firebaseAuth.currentUser!!
    firebaseUser
        .startActivityForReauthenticateWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // User is re-authenticated with fresh tokens and
            // should be able to perform sensitive operations
            // like account deletion and email or password
            // update.
        }
        .addOnFailureListener {
            // Handle failure.
        }

    Java

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
            .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
            .addOnSuccessListener(
                    new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            // User is re-authenticated with fresh tokens and
                            // should be able to perform sensitive operations
                            // like account deletion and email or password
                            // update.
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // Handle failure.
                        }
                    });

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania – nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania – za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane jako część projektu w Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od sposobu logowania.

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania przez połączenie danych logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.

Aby wylogować użytkownika, wywołaj signOut:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();