Możesz zezwolić użytkownikom na uwierzytelnianie w Firebase za pomocą dostawców protokołu OAuth, takich jak Yahoo, integrując ogólne logowanie OAuth z aplikacją za pomocą pakietu SDK Firebase, i cały proces logowania.
Zanim zaczniesz
Aby logować się użytkowników przy użyciu kont Yahoo, musisz najpierw włączyć Yahoo jako logowanie dla swojego projektu Firebase:
- Dodaj Firebase do projektu Apple.
- W konsoli Firebase otwórz sekcję Uwierzytelnianie.
- Na karcie Metoda logowania włącz dostawcę Yahoo.
- Dodaj Client ID (Identyfikator klienta) i Client Secret (Tajny klucz klienta) z konsoli programisty tego dostawcy do
konfiguracja dostawcy:
-
Aby zarejestrować klienta Yahoo OAuth, postępuj zgodnie z instrukcjami dewelopera Yahoo dokumentacja dotycząca podczas rejestracji w usłudze Yahoo.
Wybierz 2 uprawnienia interfejsu OpenID Connect API:
profile
iemail
. - Podczas rejestrowania aplikacji u tych dostawców pamiętaj o zarejestrowaniu
Domena
*.firebaseapp.com
dla Twojego projektu jako domena przekierowująca Twojego projektu .
-
- Kliknij Zapisz.
Zarejestruj się za pomocą pakietu SDK Firebase
Aby zalogować się za pomocą pakietu SDK platform Firebase Apple, wykonaj te czynności:
Dodaj niestandardowe schematy adresów URL do projektu Xcode:
- Otwórz konfigurację projektu: kliknij dwukrotnie jego nazwę w lewy widok drzewa. Wybierz aplikację w sekcji CELE, a potem wybierz kartę Informacje i rozwiń sekcję Typy adresów URL.
- Kliknij przycisk + i dodaj zakodowany identyfikator aplikacji jako adres URL.
oszustw. Zakodowany identyfikator aplikacji znajdziesz w
Ogólne
Ustawienia w konsoli Firebase w sekcji dotyczącej iOS.
. Pozostałe pola pozostaw puste.
Po zakończeniu konfiguracja powinna wyglądać podobnie do następujące (ale z wartościami związanymi z daną aplikacją):
Utwórz instancję OAuthProvider za pomocą identyfikatora dostawcy. yahoo.com,
var provider = OAuthProvider(providerID: "yahoo.com")
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"yahoo.com"];
Opcjonalnie: określ dodatkowe niestandardowe parametry OAuth, które chcesz stosować wysyłać z żądaniem OAuth.
provider.customParameters = [ "prompt": "login", "language": "fr" ]
[provider setCustomParameters:@{@"prompt": @"login", @"language": @"fr"}];
Parametry obsługiwane przez Yahoo znajdziesz Dokumentacja Yahoo OAuth. Pamiętaj, że parametrów wymaganych przez Firebase nie można przekazywać za pomocą funkcji
setCustomParameters
Te parametry to client_id, redirect_uri, response_type, scope i state.Opcjonalnie: określ dodatkowe zakresy protokołu OAuth 2.0 poza
profile
iemail
, o które chcesz poprosić dostawcę uwierzytelniania. Jeśli aplikacja wymaga dostępu do prywatnych danych użytkownika z interfejsów API Yahoo, poprosić o uprawnienia do interfejsów Yahoo API w sekcji API Permissions (Uprawnienia API) Yahoo Developer Console. Żądane zakresy protokołu OAuth muszą być dokładnie takie same jak już skonfigurowane w uprawnieniach interfejsu API aplikacji. Jeśli na przykład odczyt/zapis dostęp jest wysyłany do kontaktów użytkownika i wstępnie skonfigurowany w interfejsie API aplikacji uprawnień, należy przekazaćsdct-w
zamiast zakresu protokołu OAuth tylko do odczytusdct-r
W przeciwnym razie przepływ zakończy się niepowodzeniem, a funkcja wyświetli komunikat o błędzie użytkownika końcowego.// Request access to Yahoo Mail API. // Request read/write access to user contacts. // This must be preconfigured in the app's API permissions. provider.scopes = ["mail-r", "sdct-w"]
// Request access to Yahoo Mail API. // Request read/write access to user contacts. // This must be preconfigured in the app's API permissions. [provider setScopes:@[@"mail-r", @"sdct-w"]];
Aby dowiedzieć się więcej, zapoznaj się z Dokumentacja zakresów Yahoo.
Opcjonalnie: jeśli chcesz dostosować sposób, w jaki aplikacja prezentuje
SFSafariViewController
lubUIWebView
, gdy wyświetlając reCAPTCHA użytkownikowi, utwórz niestandardową klasę spełniającą wymagania do protokołuAuthUIDelegate
i przekazać go docredentialWithUIDelegate
.Uwierzytelniaj w Firebase za pomocą obiektu dostawcy OAuth.
provider.getCredentialWith(nil) { credential, error in if error != nil { // Handle error. } if credential != nil { Auth().signIn(with: credential) { authResult, error in if error != nil { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken } } }
[provider getCredentialWithUIDelegate:nil completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { if (error) { // Handle error. } if (credential) { [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { if (error) { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }]; } }];
Korzystając z tokena dostępu OAuth, możesz wywoływać metodę Interfejs Yahoo API.
Aby na przykład uzyskać podstawowe informacje o profilu, możesz wywołać interfejs API REST, przekazując token dostępu w nagłówku
Authorization
:https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json
Gdzie
YAHOO_USER_UID
to identyfikator użytkownika Yahoo, z którego można pobrać dane polaAuth.auth.currentUser.providerData[0].uid
lub odauthResult.additionalUserInfo.profile
Powyższe przykłady dotyczą procesu logowania, ale masz też możliwość połączenia dostawcy Yahoo z istniejącym użytkownikiem za pomocą
linkWithPopup
Możesz na przykład połączyć kilka dostawców usług dla tego samego użytkownika, umożliwiając im logowanie się za pomocą dowolnej z nich.Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // Yahoo credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken }
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // Yahoo credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }];
Tego samego wzoru można użyć w funkcji
reauthenticateWithPopup
/reauthenticateWithRedirect
, które można wykorzystać, aby: pobieranie nowych danych logowania na potrzeby operacji poufnych, które wymagają ostatnich dane logowania.Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token is can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken }
[[FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }];
Postępowanie w przypadku błędów dotyczących konta z innymi danymi logowania
Jeśli w konsoli Firebase masz włączone ustawienie Jedno konto na każdy adres e-mail,
gdy użytkownik próbuje zalogować się na konto w usłudze dostawcy (np. Yahoo) przy użyciu adresu e-mail, który
dla dostawcy innego użytkownika Firebase (np. Google), błąd
Rzucany FIRAuthErrorCodeAccountExistsWithDifferentCredential
wraz z tymczasowym strzałem
Obiekt FIRAuthCredential
(dane logowania Yahoo). Aby dokończyć logowanie się w
do dostawcy usług, użytkownik musi najpierw zalogować się do istniejącego dostawcy (Google), a następnie dodać link
poprzednie dane logowania do Yahoo: FIRAuthCredential
. Wygląda to w taki sposób, jak pokazano poniżej:
// Sign-in with an OAuth credential. provider.getCredentialWith(nil) { credential, error in // An account with the same email already exists. if (error as NSError?)?.code == AuthErrorCode.accountExistsWithDifferentCredential.rawValue { // Get pending credential and email of existing account. let existingAcctEmail = (error! as NSError).userInfo[AuthErrorUserInfoEmailKey] as! String let pendingCred = (error! as NSError).userInfo[AuthErrorUserInfoUpdatedCredentialKey] as! AuthCredential // Lookup existing account identifier by the email. Auth.auth().fetchProviders(forEmail:existingAcctEmail) { providers, error in // Existing email/password account. if (providers?.contains(EmailAuthProviderID))! { // Existing password account for email. Ask user to provide the password of the // existing account. // Sign in with existing account. Auth.auth().signIn(withEmail:existingAcctEmail, password:password) { user, error in // Successfully signed in. if user != nil { // Link pending credential to account. Auth.auth().currentUser?.linkAndRetrieveData(with: pendingCred) { result, error in // ... } } } } } return } // Other errors. if error != nil { // handle the error. return } // Sign in with the credential. if credential != nil { Auth.auth().signInAndRetrieveData(with: credential!) { result, error in if error != nil { // handle the error. return } } } }
// Sign-in with an OAuth credential. [provider getCredentialWithUIDelegate:nil completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { // An account with the same email already exists. if (error.code == FIRAuthErrorCodeAccountExistsWithDifferentCredential) { // Get pending credential and email of existing account. NSString *existingAcctEmail = error.userInfo[FIRAuthErrorUserInfoEmailKey]; FIRAuthCredential *pendingCred = error.userInfo[FIRAuthErrorUserInfoUpdatedCredentialKey]; // Lookup existing account identifier by the email. [[FIRAuth auth] fetchProvidersForEmail:existingAcctEmail completion:^(NSArray<NSString *> *_Nullable providers, NSError *_Nullable error) { // Existing email/password account. if ( [providers containsObject:FIREmailAuthProviderID] ) { // Existing password account for email. Ask user to provide the password of the // existing account. // Sign in with existing account. [[FIRAuth auth] signInWithEmail:existingAcctEmail password:password completion:^(FIRUser *user, NSError *error) { // Successfully signed in. if (user) { // Link pending credential to account. [[FIRAuth auth].currentUser linkWithCredential:pendingCred completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { // ... }]; } }]; } }]; return; } // Other errors. if (error) { // handle the error. return; } // Sign in with the credential. if (credential) { [[FIRAuth auth] signInAndRetrieveDataWithCredential:credential completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { if (error) { // handle the error. return; } }]; } }];
Zaawansowane: logowanie się ręcznie
W przeciwieństwie do innych dostawców protokołu OAuth obsługiwanych przez Firebase, takich jak Google, Facebook, i Twitterze, gdzie można zalogować się bezpośrednio za pomocą tokena dostępu OAuth. opartych na danych logowania, Uwierzytelnianie Firebase nie obsługuje tej samej funkcji takich jak Yahoo, ponieważ Firebase Serwer uwierzytelniania do zweryfikowania odbiorców tokenów dostępu Yahoo OAuth. Jest to kluczowe wymaganie dotyczące bezpieczeństwa i może ujawnić aplikacje oraz w celu ponownego odtwarzania ataków, w przypadku których token dostępu Yahoo OAuth uzyskany dla jeden projekt (atakujący) może zostać użyty do zalogowania się do innego projektu (ofiary). Zamiast tego Uwierzytelnianie Firebase oferuje możliwość obsługi całego przepływu OAuth wymiana kodów autoryzacji przy użyciu identyfikatora klienta i tajnego klucza OAuth skonfigurowane w konsoli Firebase. Ponieważ kodu autoryzacji można używać tylko w połączeniu z określonym identyfikatorem lub tajnym kluczem klienta, kodem autoryzacji uzyskane dla jednego projektu nie mogą być używane w innym.
Jeśli korzystanie z usług tych dostawców jest wymagane w nieobsługiwanych środowiskach, biblioteki protokołu OAuth innej firmy Niestandardowe uwierzytelnianie Firebase zastosowali różne metody. Pierwszy jest potrzebny do uwierzytelniania u dostawcy a ten drugi na wymianę danych logowania dostawcy na token niestandardowy.
Dalsze kroki
Gdy użytkownik zaloguje się po raz pierwszy, tworzone jest nowe konto użytkownika. powiązane z danymi logowania, czyli z nazwą użytkownika, hasłem i numerem telefonu, numer telefonu lub informacje o dostawcy uwierzytelniania – użytkownik zalogowany. Ten nowy jest przechowywane w ramach projektu Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od tego, jak się loguje.
-
W swoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z
User
. Zobacz Zarządzanie użytkownikami. Na liście Firebase Realtime Database i Cloud Storage regułami zabezpieczeń, pobierz ze zmiennej
auth
unikalny identyfikator zalogowanego użytkownika, i używać ich do kontrolowania, do jakich danych użytkownik ma dostęp.
Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu wielokrotnego uwierzytelniania. dostawców, łącząc dane logowania dostawcy uwierzytelniania z istniejącego konta użytkownika.
Aby wylogować użytkownika, wywołaj
signOut:
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Można także dodać kod obsługi błędów dla pełnego zakresu uwierzytelniania . Patrz Obsługa błędów.