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:
- W konsoli Firebase otwórz sekcję Uwierzytelnianie.
- Na karcie Metoda logowania włącz dostawcę Yahoo.
- Dodaj identyfikator klienta i klucz klienta z konsoli programisty tego dostawcy do konfiguracji dostawcy:
-
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
iemail
. - Gdy rejestrujesz aplikacje u tych dostawców, pamiętaj, aby zarejestrować dla swojego projektu domenę
*.firebaseapp.com
jako domenę przekierowującą aplikacji.
-
- Kliknij Zapisz.
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:
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");
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.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 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ć uprawnieniasdct-w
zamiast zakresu protokołu OAuthsdct-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.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 polafirebaseAuth.getCurrentUser().getProviderData().get(0).getUid()
lub z polaauthResult.getAdditionalUserInfo().getProfile()
.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. } });
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();