Możesz pozwolić swoim użytkownikom na uwierzytelnianie w Firebase przy użyciu dostawców OAuth, takich jak GitHub, integrując ogólne logowanie OAuth z aplikacją przy użyciu pakietu SDK Firebase, aby przeprowadzić proces logowania od początku do końca.
Zanim zaczniesz
Aby logować się użytkowników za pomocą kont GitHub, musisz najpierw włączyć GitHub jako dostawcę logowania dla swojego projektu Firebase:
- Dodaj Firebase do swojego projektu na iOS .
pod 'Firebase/Auth'
- W konsoli Firebase otwórz sekcję Auth .
- Na karcie Metoda logowania włącz dostawcę GitHub .
- Dodaj identyfikator klienta i klucz tajny klienta z konsoli programisty tego dostawcy do konfiguracji dostawcy:
- Zarejestruj swoją aplikację jako aplikację deweloperską na GitHub i uzyskaj identyfikator klienta OAuth 2.0 oraz klucz klienta .
- Upewnij się, że identyfikator URI przekierowania
my-app-12345.firebaseapp.com/__/auth/handler
OAuth (np.my-app-12345.firebaseapp.com/__/auth/handler
) jest ustawiony jako adres URL wywołania zwrotnego autoryzacji na stronie ustawień aplikacji w konfiguracji aplikacji GitHub .
- Kliknij Zapisz .
Obsługuj proces logowania za pomocą pakietu Firebase SDK
Aby obsłużyć proces logowania za pomocą Firebase iOS SDK, wykonaj następujące kroki:
Dodaj niestandardowe schematy adresów URL do projektu Xcode:
- Otwórz konfigurację projektu: kliknij dwukrotnie nazwę projektu w lewym widoku drzewa. Wybierz swoją aplikację z sekcji CELE , a następnie wybierz kartę Informacje i rozwiń sekcję Typy adresów URL .
- Kliknij przycisk + i dodaj schemat adresu URL dla swojego odwróconego identyfikatora klienta. Aby znaleźć tę wartość, otwórz plik konfiguracyjny
i poszukaj kluczaGoogleService-Info.plist REVERSED_CLIENT_ID
. Skopiuj wartość tego klucza i wklej go w polu Schematy adresów URL na stronie konfiguracji. Pozostałe pola pozostaw puste.Po zakończeniu konfiguracja powinna wyglądać podobnie do poniższego (ale z wartościami specyficznymi dla aplikacji):
Utwórz wystąpienie dostawcy OAuthProvider, używając identyfikatora dostawcy github.com .
Szybki
var provider = OAuthProvider(providerID: "github.com")
Cel C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
Opcjonalnie : określ dodatkowe niestandardowe parametry OAuth, które chcesz wysłać z żądaniem OAuth.
Szybki
provider.customParameters = [ "allow_signup": "false" ]
Cel C
[provider setCustomParameters:@{@"allow_signup": @"false"}];
Aby zapoznać się z parametrami obsługiwanymi przez GitHub, zobacz dokumentację GitHub OAuth . Pamiętaj, że nie możesz przekazać parametrów wymaganych przez
setCustomParameters
pomocąsetCustomParameters
. Te parametry to client_id , redirect_uri , response_type , scope i state .Opcjonalnie : określ dodatkowe zakresy protokołu OAuth 2.0 poza profilem podstawowym, którego chcesz zażądać od dostawcy uwierzytelniania. Jeśli Twoja aplikacja wymaga dostępu do prywatnych danych użytkownika z interfejsów API GitHub, musisz poprosić o uprawnienia dostępu do interfejsów API GitHub w sekcji Uprawnienia API w konsoli programisty GitHub. Żądane zakresy OAuth muszą dokładnie odpowiadać wartościom wstępnie skonfigurowanym w uprawnieniach interfejsu API aplikacji.
Szybki
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = ["user:email"]
Cel C
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. [provider setScopes:@[@"user:email"]];
Aby dowiedzieć się więcej, zapoznaj się z dokumentacją zakresów usługi GitHub .
Opcjonalnie : jeśli chcesz dostosować sposób, w jaki aplikacja prezentuje
SFSafariViewController
lubUIWebView
podczas wyświetlania reCAPTCHA użytkownikowi, utwórz niestandardową klasę zgodną z protokołemFIRAuthUIDelegate
i przekaż ją dogetCredentialWithUIDelegate:completion:
Uwierzytelnij się w Firebase przy użyciu obiektu dostawcy OAuth.
Szybki
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. guard let oauthCredential = authResult.credential as? OAuthCredential else { return } // GitHub OAuth access token can also be retrieved by: // oauthCredential.accessToken // GitHub OAuth ID token can be retrieved by calling: // oauthCredential.idToken } } }
Cel C
[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. FIROAuthCredential *oauthCredential = (FIROAuthCredential *)authResult.credential; // GitHub OAuth access token can also be retrieved by: // oauthCredential.accessToken // GitHub OAuth ID token can be retrieved by calling: // oauthCredential.idToken }]; } }];
Korzystając z tokena dostępu OAuth, możesz wywołać interfejs API GitHub .
Na przykład, aby uzyskać podstawowe informacje o profilu, możesz wywołać REST API, przekazując token dostępu w nagłówku
Authorization
:https://api.github.com/user
Chociaż powyższe przykłady koncentrują się na przepływach logowania, masz również możliwość połączenia dostawcy GitHub z istniejącym użytkownikiem. Na przykład możesz połączyć wielu dostawców z tym samym użytkownikiem, umożliwiając im logowanie się za pomocą jednego z nich.
Szybki
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // GitHub credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // GitHub OAuth access token can also be retrieved by: // authResult.credential.accessToken // GitHub OAuth ID token can be retrieved by calling: // authResult.credential.idToken }
Cel C
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // GitHub credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // GitHub OAuth access token is can also be retrieved by: // authResult.credential.accessToken // GitHub OAuth ID token can be retrieved by calling: // authResult.credential.idToken }];
Ten sam wzorzec może być używany z
reauthenticateWithCredential
którego można użyć do pobrania świeżych poświadczeń dla poufnych operacji, które wymagają ostatniego logowania.Szybki
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.accessToken // GitHub OAuth ID token can be retrieved by calling: // authResult.credential.idToken }
Cel C
[[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: // authResult.credential.accessToken // GitHub OAuth ID token can be retrieved by calling: // authResult.credential.idToken }];
Następne kroki
Gdy użytkownik loguje się po raz pierwszy, tworzone jest nowe konto użytkownika i jest ono łączone z poświadczeniami - czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami dostawcy uwierzytelniania - zalogowanym użytkownikiem. To nowe konto jest przechowywane jako część projektu Firebase i może służyć do identyfikacji użytkownika we wszystkich aplikacjach w Twoim projekcie, niezależnie od tego, w jaki sposób się on zaloguje.
W swoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu
FIRUser
. Zobacz Zarządzanie użytkownikami .W swoich regułach bezpieczeństwa Firebase Realtime Database i Cloud Storage możesz uzyskać unikalny identyfikator zalogowanego użytkownika ze zmiennej
auth
i użyć go do kontrolowania, do jakich danych użytkownik ma dostęp.
Możesz zezwolić użytkownikom na logowanie się do aplikacji przy użyciu wielu dostawców uwierzytelniania, łącząc poświadczenia dostawcy uwierzytelniania z istniejącym kontem użytkownika.
Aby wylogować użytkownika, wywołaj signOut:
Szybki
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print ("Error signing out: %@", signOutError) }
Cel C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Możesz także dodać kod obsługi błędów dla pełnego zakresu błędów uwierzytelniania. Zobacz Obsługa błędów .