Uwierzytelniaj za pomocą GitHuba na platformach Apple

Możesz umożliwić użytkownikom uwierzytelnianie w Firebase za pomocą dostawców OAuth, takich jak GitHub, integrując w aplikacji ogólne logowanie OAuth za pomocą pakietu SDK Firebase, aby przeprowadzić cały proces logowania.

Zanim zaczniesz

Aby umożliwić użytkownikom logowanie się za pomocą kont GitHub, musisz najpierw włączyć GitHub jako dostawcę logowania w projekcie Firebase:

Do instalacji zależności Firebase i do zarządzania nimi możesz używać menedżera pakietów Swift.

  1. Po otwarciu projektu aplikacji wybierz w Xcode opcję File > Add Packages (Plik > Dodaj pakiety).
  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę Firebase Authentication.
  5. Dodaj flagę -ObjC do sekcji Other Linker Flags (Inne flagi linkera) w ustawieniach kompilacji celu.
  6. Gdy skończysz, Xcode zacznie automatycznie wyszukiwać i pobierać Twoje zależności w tle.

Teraz wykonaj kilka czynności konfiguracyjnych:

  1. W konsoli Firebase otwórz Security > Authentication.
  2. Na karcie Sign-in method (Metoda logowania) włącz dostawcę logowania GitHub.
  3. Dodaj identyfikator klienta i tajny klucz klienta z konsoli dewelopera tego dostawcy do konfiguracji dostawcy:
    1. Zarejestruj aplikację jako aplikację dewelopera na GitHubie i uzyskaj OAuth 2.0 identyfikator klienta oraz tajny klucz klienta.
    2. Upewnij się, że identyfikator URI przekierowania OAuth Firebase (np. my-app-12345.firebaseapp.com/__/auth/handler) jest ustawiony jako URL wywołania zwrotnego autoryzacji na stronie ustawień aplikacji w konfiguracji aplikacji na GitHubie.
  4. Kliknij Zapisz.

Obsługa procesu logowania za pomocą pakietu SDK Firebase

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

  1. Dodaj niestandardowe schematy adresów URL do projektu Xcode:

    1. Otwórz konfigurację projektu: kliknij dwukrotnie nazwę projektu w widoku drzewa po lewej stronie. Wybierz aplikację w sekcji TARGETS (Cele), a następnie kliknij kartę Info (Informacje) i rozwiń sekcję URL Types (Typy adresów URL).
    2. Kliknij przycisk + i dodaj zakodowany identyfikator aplikacji jako schemat URI adresu URL. Pozostałe pola pozostaw puste.

      Zakodowany identyfikator aplikacji znajdziesz w konsoli Firebase: otwórz ustawienia Settings > kartę General, a następnie przewiń w dół do sekcji Your apps, aby wyświetlić szczegóły aplikacji na iOS.

      Po zakończeniu konfiguracja powinna wyglądać podobnie do tej (ale z wartościami specyficznymi dla Twojej aplikacji):

      Zrzut ekranu interfejsu konfiguracji niestandardowego schematu URI adresu URL w Xcode

  2. Utwórz instancję OAuthProvider , używając identyfikatora dostawcy github.com.

    Swift

        var provider = OAuthProvider(providerID: "github.com")
        

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
        
  3. Opcjonalnie: określ dodatkowe niestandardowe parametry OAuth, które chcesz wysłać z żądaniem OAuth.

    Swift

        provider.customParameters = [
          "allow_signup": "false"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"allow_signup": @"false"}];
        

    Parametry obsługiwane przez GitHub znajdziesz w dokumentacji OAuth na GitHubie. Pamiętaj, że nie możesz przekazywać parametrów wymaganych przez Firebase za pomocą setCustomParameters. Są to parametry client_id, redirect_uri, response_type, scope i state.

  4. Opcjonalnie: określ dodatkowe zakresy OAuth 2.0 poza podstawowym profilem, o które chcesz poprosić dostawcę 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 API Permissions (Uprawnienia interfejsu API) w konsoli dewelopera GitHub. Żądane zakresy OAuth muszą dokładnie odpowiadać zakresom wstępnie skonfigurowanym w uprawnieniach interfejsu API aplikacji.

    Swift

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        provider.scopes = ["user:email"]
        

    Objective-C

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        [provider setScopes:@[@"user:email"]];
        

    Więcej informacji znajdziesz w dokumentacji zakresów GitHub.

  5. Opcjonalnie: jeśli chcesz dostosować sposób, w jaki aplikacja wyświetla SFSafariViewController lub UIWebView podczas wyświetlania użytkownikowi reCAPTCHA, utwórz klasę niestandardową zgodną z protokołem AuthUIDelegate i przekaż ją do credentialWithUIDelegate.

  6. Uwierzytelnij się w Firebase za pomocą obiektu dostawcy OAuth.

    Swift

        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
            }
          }
        }
        

    Objective-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
            }];
          }
        }];
        

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

    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://api.github.com/user
  7. Powyższe przykłady koncentrują się na procesach logowania, ale możesz też połączyć dostawcę GitHub z istniejącym użytkownikiem. Możesz na przykład połączyć kilku dostawców z tym samym użytkownikiem, aby umożliwić mu logowanie się za pomocą dowolnego z nich.

    Swift

        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 as? OAuthCredential)?.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-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:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        
  8. Ten sam wzorzec można stosować z reauthenticateWithCredential, którego można używać do pobierania nowych danych logowania w przypadku operacji wrażliwych wymagających niedawnego logowania.

    Swift

        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
          // GitHub OAuth ID token can be retrieved by calling:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-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:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania – nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania – za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane jako część projektu w Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od sposobu logowania.

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

  • W regułach bezpieczeństwa Firebase Realtime Database i Cloud Storage , możesz pobrać unikalny identyfikator użytkownika zalogowanego z zmiennej auth, i użyć go do kontrolowania, do jakich danych użytkownik może mieć dostęp.

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania przez połączenie danych logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.

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

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Możesz też dodać kod obsługi błędów dla pełnego zakresu błędów uwierzytelniania. Zobacz Obsługa błędów.