Możesz umożliwić użytkownikom uwierzytelnianie się w Firebase za pomocą dostawców OAuth, takich jak Yahoo. Aby zrealizować cały proces logowania, zintegruj z aplikacją ogólne logowanie OAuth w internecie za pomocą pakietu SDK Firebase.
Zanim zaczniesz
Aby umożliwić użytkownikom logowanie się za pomocą kont Yahoo, musisz najpierw włączyć Yahoo jako dostawcę logowania w projekcie Firebase:
- W konsoli Firebase otwórz sekcję Autoryzacja.
- Na karcie Metoda logowania włącz dostawcę Yahoo.
- Dodaj Identyfikator klienta i Tajny klucz klienta z konsoli deweloperskiej tego dostawcy do konfiguracji tego dostawcy:
-
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
iemail
. - Podczas rejestrowania aplikacji u tych dostawców pamiętaj, aby zarejestrować domenę
*.firebaseapp.com
dla projektu jako domenę przekierowania dla aplikacji.
-
- Kliknij Zapisz.
Jeśli nie masz jeszcze określonego odcisku cyfrowego SHA-1 aplikacji, zrób to na stronie Ustawienia w konsoli Firebase. Szczegółowe informacje o pobieraniu odcisku cyfrowego SHA-1 aplikacji znajdziesz w artykule Uwierzytelnianie klienta.
Obsługa procesu logowania za pomocą pakietu SDK Firebase
Jeśli tworzysz aplikację na Androida, najłatwiejszą metodą uwierzytelniania użytkowników za pomocą Firebase przy użyciu ich kont Yahoo jest przeprowadzenie całego procesu logowania za pomocą pakietu SDK Firebase na Androida.
Aby obsłużyć proces logowania za pomocą pakietu Firebase Android SDK, wykonaj te czynności:
Utwórz instancję OAuthProvider za pomocą jego Buildera z identyfikatorem dostawcy yahoo.com.
val provider = OAuthProvider.newBuilder("yahoo.com")
OAuthProvider.Builder provider = OAuthProvider.newBuilder("yahoo.com");
Opcjonalnie: określ dodatkowe niestandardowe parametry OAuth, które chcesz wysłać z prośbą OAuth.
// Prompt user to re-authenticate to Yahoo. provider.addCustomParameter("prompt", "login") // Localize to French. provider.addCustomParameter("language", "fr")
// 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 za pomocą parametru
setCustomParameters()
nie możesz przekazywać parametrów wymaganych przez Firebase. Są to: client_id, redirect_uri, response_type, scope i state.Opcjonalnie: określ dodatkowe zakresy OAuth 2.0 poza
profile
iemail
, o które chcesz poprosić dostawcę uwierzytelniania. Jeśli Twoja aplikacja wymaga dostępu do prywatnych danych użytkownika z interfejsów Yahoo, musisz poprosić o uprawnienia do interfejsów Yahoo w sekcji Uprawnienia interfejsu API w Konsoli deweloperów Yahoo. Żądane zakresy uprawnień OAuth muszą dokładnie odpowiadać zakresom skonfigurowanym w uprawnieniach interfejsu API aplikacji. Jeśli na przykład żądasz dostępu do kontaktów użytkownika na potrzeby odczytu i zapisu, a uprawnienia w interfejsie API aplikacji są skonfigurowane wstępnie, zamiast zakresu OAuth tylko do odczytusdct-r
musisz podać wartośćsdct-w
. W przeciwnym razie proces się nie powiedzie i użytkownik zobaczy komunikat o błędzie.// 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")
Aby dowiedzieć się więcej, zapoznaj się z dokumentacją zakresów Yahoo.// 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);
Uwierzytelnij się w Firebase, używając obiektu dostawcy OAuth. Pamiętaj, że w odróżnieniu od innych operacji FirebaseAuth ta operacja przejmie kontrolę nad interfejsem, wyświetlając niestandardową kartę Chrome. W związku z tym nie odwołuj się do swojej aktywności w dołączonych przez siebie interfejsach OnSuccessListeners i OnFailureListeners, ponieważ zostaną one natychmiast odłączone, gdy operacja uruchomi interfejs użytkownika.
Najpierw sprawdź, czy nie dotarła do Ciebie już odpowiedź. Logowanie się w ten sposób powoduje, że Twoja aktywność jest przenoszona do tła, co oznacza, że system może ją wykorzystać podczas procesu logowania. Aby mieć pewność, że użytkownik nie będzie musiał powtarzać próby, sprawdź, czy wynik nie jest już dostępny.
Aby sprawdzić, czy nie ma oczekujących wyników, zadzwoń pod numer
getPendingAuthResult
: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. }
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, zadzwoń pod numer
startActivityForSignInWithProvider
: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. }
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 procesu z zwróconego obiektu
OAuthCredential
można pobrać token dostępu OAuth powiązany z usługodawcą.Za pomocą tokena dostępu OAuth możesz wywoływać interfejs Yahoo API.
Gdzie
YAHOO_USER_UID
to identyfikator użytkownika Yahoo, który można przeanalizować w polufirebaseAuth.getCurrentUser().getProviderData().get(0).getUid()
lub w poluauthResult.getAdditionalUserInfo().getProfile()
.Powyższe przykłady koncentrują się na procesach logowania, ale za pomocą
startActivityForLinkWithProvider
możesz też połączyć dostawcę Yahoo z dotychczasowym użytkownikiem. Możesz na przykład powiązać z tym samym użytkownikiem wielu dostawców, aby mógł się zalogować za pomocą dowolnego z nich.// 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. }
// 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. } });
Tego samego schematu można używać w przypadku funkcji
startActivityForReauthenticateWithProvider
, która umożliwia pobieranie nowych danych logowania na potrzeby operacji narażonych na wyciek danych, które wymagają niedawnego zalogowania się.// 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. }
// 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. } });
Zaawansowane: ręczne przetwarzanie procesu logowania
W odróżnieniu od innych dostawców OAuth obsługiwanych przez Firebase, takich jak Google, Facebook i Twitter, gdzie logowanie można przeprowadzić bezpośrednio za pomocą danych logowania opartych na tokenach dostępu OAuth, usługa Firebase Auth nie obsługuje tej samej funkcji w przypadku dostawców takich jak Yahoo, ponieważ serwer Firebase Auth nie może zweryfikować odbiorców tokenów dostępu OAuth Yahoo. Jest to kluczowe wymaganie bezpieczeństwa, ponieważ aplikacje i witryny mogą być narażone na ataki polegające na odtwarzaniu, w których token dostępu OAuth Yahoo uzyskany dla jednego projektu (atakujący) może być użyty do zalogowania się w innym projekcie (ofiara). Zamiast tego Firebase Auth umożliwia obsługę całego procesu OAuth i wymiany kodu autoryzacji za pomocą identyfikatora klienta OAuth i tajemnego klucza skonfigurowanych w Konsoli Firebase. Kod autoryzacji można użyć tylko w połączeniu z konkretnym identyfikatorem klienta lub kluczem tajnym. Kod autoryzacji uzyskany w jednym projekcie nie może być użyty w innym.
Jeśli te usługi są wymagane w nieobsługiwanych środowiskach, musisz użyć biblioteki OAuth innej firmy i niestandardowej autoryzacji Firebase. Pierwszy z nich jest potrzebny do uwierzytelnienia się u dostawcy, a drugi do wymiany danych logowania dostawcy na token niestandardowy.
Dalsze kroki
Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania, czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami dostawcy uwierzytelniania, za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane w projekcie Firebase i może służyć do identyfikowania użytkownika we wszystkich aplikacjach w projekcie, niezależnie od tego, jak użytkownik się loguje.
-
W swoich aplikacjach możesz pobrać podstawowe informacje o profilu użytkownika z obiektu
FirebaseUser
. Zobacz sekcję Zarządzanie użytkownikami. W regułach Firebase Realtime Database i Cloud Storage Regułach bezpieczeństwa możesz pobrać z zmiennej
auth
unikalny identyfikator zalogowanego użytkownika i używać go do kontrolowania dostępu użytkownika do danych.
Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą danych uwierzytelniających od różnych dostawców, łącząc je z dotychczasowym kontem użytkownika.
Aby wylogować użytkownika, wywołaj funkcję
signOut
:
Firebase.auth.signOut()
FirebaseAuth.getInstance().signOut();