Uwierzytelnianie w Yahoo na Androidzie

Możesz pozwolić użytkownikom na uwierzytelnianie w Firebase za pomocą dostawców OAuth takich jak Yahoo. W tym celu zintegruj internetowe logowanie OAuth w aplikacji za pomocą pakietu SDK Firebase, który przeprowadzi cały proces logowania.

Zanim zaczniesz

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

  1. Dodaj Firebase do swojego projektu na Androida.

  2. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
  3. Na karcie Metoda logowania włącz dostawcę Yahoo.
  4. Dodaj identyfikator klienta i klucz klienta z konsoli programisty tego dostawcy do konfiguracji dostawcy:
    1. Aby zarejestrować klienta Yahoo OAuth, zapoznaj się z dokumentacją dla deweloperów Yahoo! dotyczącą rejestrowania aplikacji internetowej w Yahoo.

      Wybierz 2 uprawnienia interfejsu OpenID Connect API: profile i email.

    2. Gdy rejestrujesz aplikacje u tych dostawców, pamiętaj, aby zarejestrować dla swojego projektu domenę *.firebaseapp.com jako domenę przekierowującą aplikacji.
  5. Kliknij Zapisz.
  6. Jeśli odcisk cyfrowy SHA-1 nie został jeszcze określony, możesz to zrobić na stronie Ustawienia w konsoli Firebase. Szczegółowe informacje o tym, jak pobrać odcisk cyfrowy SHA-1 aplikacji, znajdziesz w artykule Uwierzytelnianie klienta.

Obsługa procesu logowania za pomocą pakietu SDK Firebase

Jeśli tworzysz aplikację na Androida, najprostszym sposobem uwierzytelnienia użytkowników w Firebase za pomocą ich kont Yahoo jest przeprowadzenie całego procesu logowania za pomocą pakietu SDK Firebase na Androida.

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

  1. Utwórz instancję obiektu OAuthProvider, używając jego elementu Builder z identyfikatorem dostawcy yahoo.com.

    Kotlin+KTX

    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 wysyłać w żądaniu OAuth.

    Kotlin+KTX

    // 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 protokołu Yahoo OAuth. Pamiętaj, że nie możesz przekazywać parametrów wymaganych przez Firebase za pomocą funkcji setCustomParameters(). Są to: client_id, redirect_uri, response_type, scope i state.

  3. Opcjonalnie: określ dodatkowe zakresy 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 Yahoo API, musisz poprosić o uprawnienia do interfejsów API Yahoo w sekcji Uprawnienia API w konsoli programisty Yahoo. Żądane zakresy protokołu OAuth muszą być ściśle zgodne z wstępnie skonfigurowanymi zakresami uprawnień aplikacji w interfejsie API. Jeśli na przykład prośby o dostęp do odczytu i zapisu są wysyłane do kontaktów użytkownika i skonfigurowane w uprawnieniach do interfejsu API aplikacji, należy przekazać uprawnienia sdct-w zamiast zakresu protokołu OAuth sdct-r, a nie tylko do odczytu. W przeciwnym razie proces nie powiedzie się,a użytkownik zobaczy komunikat o błędzie.

    Kotlin+KTX

    // 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 w Firebase za pomocą obiektu dostawcy OAuth. Zwróć uwagę, że w przeciwieństwie do innych operacji FirebaseAuth ta funkcja przejmie kontrolę nad interfejsem użytkownika, otwierając niestandardową kartę Chrome. W związku z tym nie wspominaj o swojej aktywności w dołączonych parametrach OnSuccessListeners i OnFailureListeners, ponieważ zostaną one odłączone natychmiast po uruchomieniu operacji w interfejsie.

    Najpierw sprawdź, czy nie masz już odpowiedzi. Jeśli zalogujesz się tą metodą, Twoja aktywność zostanie umieszczona w tle, co oznacza, że system może ją odzyskać. Aby mieć pewność, że w takiej sytuacji użytkownik nie spróbuje ponownie, sprawdź, czy wynik już się pojawił.

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

    Kotlin+KTX

    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+KTX

    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 ukończeniu token dostępu OAuth powiązany z dostawcą może zostać pobrany ze zwróconego obiektu OAuthCredential.

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

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

  5. Powyższe przykłady dotyczą procesów logowania, ale możesz też połączyć dostawcę Yahoo z dotychczasowym użytkownikiem za pomocą parametru startActivityForLinkWithProvider. Możesz na przykład połączyć kilku dostawców z tym samym użytkownikiem, co pozwoli im logować się przy użyciu dowolnego z tych systemów.

    Kotlin+KTX

    // 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żywać z funkcją startActivityForReauthenticateWithProvider. Za jej pomocą można pobierać nowe dane logowania w przypadku operacji wrażliwych, które wymagają niedawnego logowania.

    Kotlin+KTX

    // 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, zostaje utworzone nowe konto użytkownika powiązane z danymi logowania (tj. nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania), przy użyciu którego się zalogował. Nowe konto jest przechowywane w ramach projektu Firebase i może służyć do identyfikowania użytkowników we wszystkich aplikacjach w projekcie niezależnie od tego, jak się on zaloguje.

  • W aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu FirebaseUser. Zobacz Zarządzanie użytkownikami.

  • W Regułach zabezpieczeń Bazy danych czasu rzeczywistego Firebase i Cloud Storage możesz uzyskać unikalny identyfikator zalogowanego użytkownika ze zmiennej auth i za jego pomocą kontrolować, do jakich danych ma on dostęp.

Jeśli chcesz zezwolić użytkownikom na logowanie się w Twojej aplikacji za pomocą różnych dostawców uwierzytelniania, możesz połączyć dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();