Uwierzytelniaj za pomocą OpenID Connect na platformach Apple

Jeśli korzystasz z usługi Firebase Authentication with Identity Platform, możesz uwierzytelniać użytkowników przy użyciu Firebase za pomocą wybranego przez Ciebie dostawcy zgodnego z OpenID Connect (OIDC). Ten pozwala na korzystanie z dostawców tożsamości, które nie są natywnie obsługiwane przez Firebase.

Zanim zaczniesz

Aby zalogować użytkowników przy użyciu dostawcy OIDC, musisz najpierw zebrać pewne informacje od dostawcy:

  • Identyfikator klienta: unikalny ciąg znaków identyfikujący aplikację. Twoje dostawca może przypisać Ci inny identyfikator klienta dla każdej obsługiwanej platformy. To jest jedna z wartości roszczenia aud w tokenach tożsamości wystawionych przez dostawcy usług.

  • Tajny klucz klienta: tajny ciąg znaków używany przez dostawcę do potwierdzania własności. identyfikatora klienta. Do każdego identyfikatora klienta musi być dopasowany tajny klucz klienta. (Ta wartość jest wymagana tylko w przypadku przepływu kodu uwierzytelniającego, który jest zdecydowanie zalecane).

  • Wystawca: ciąg znaków identyfikujący dostawcę. Ta wartość musi być adresem URL że po dodaniu ciągu /.well-known/openid-configuration będzie to lokalizacja dokumentu wykrywania OIDC dostawcy. Jeśli na przykład wystawcą jest https://auth.example.com, dokument opisujący musi być dostępny na https://auth.example.com/.well-known/openid-configuration

Po uzyskaniu tych informacji włącz OpenID Connect, aby się zalogować. dla swojego projektu Firebase:

  1. Dodaj Firebase do swojego projektu iOS.

  2. Jeśli nie korzystasz jeszcze z wersji Firebase Authentication with Identity Platform, zrób to. Uwierzytelnianie OpenID Connect jest dostępne tylko w uaktualnionych projektach.

  3. Na stronie Dostawcy logowania. w konsoli Firebase, kliknij Dodaj nowego dostawcę i wybierz OpenID Connect.

  4. Wybierz, czy będziesz korzystać z przepływu kodu autoryzacji czy przepływ niejawny.

    Należy zawsze używać przepływu kodu, jeśli dostawca go obsługuje. Przepływ niejawny jest mniej bezpieczny i zdecydowanie odradzamy jego używanie.

  5. Nazwij tego dostawcę. Zanotuj wygenerowany identyfikator dostawcy: np. oidc.example-provider. Ten identyfikator będzie potrzebny podczas dodawania kod logowania do aplikacji.

  6. Podaj swój identyfikator klienta i tajny klucz klienta oraz ciąg znaków wydawcy dostawcy. Te wartości muszą dokładnie odpowiadać wartościom przypisanym przez dostawcę.

  7. Zapisz zmiany.

Zarejestruj się za pomocą pakietu SDK Firebase

Najłatwiejszy sposób uwierzytelniania użytkowników w Firebase przy użyciu OIDC jest do obsługi całej procedury logowania za pomocą pakietu SDK Firebase.

Aby obsługiwać logowanie za pomocą pakietu SDK platform Firebase Apple, postępuj zgodnie z tymi wskazówkami kroki:

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

    1. 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.
    2. 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ą):

      Zrzut ekranu interfejsu konfiguracji niestandardowego schematu adresu URL Xcode
  2. Utwórz instancję OAuthProvider, używając otrzymanego identyfikatora dostawcy w konsoli Firebase.

    Swift

    var provider = OAuthProvider(providerID: "oidc.example-provider")
    

    Objective-C

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

    Swift

    provider.customParameters = [
      "login_hint": "user@example.com"
    ]
    

    Objective-C

    [provider setCustomParameters:@{@"login_hint": @"user@example.com"}];
    

    Skontaktuj się z dostawcą, aby poznać obsługiwane parametry. Pamiętaj, że parametrów wymaganych przez Firebase nie można przekazywać za pomocą funkcji setCustomParameters Te parametry to: client_id, response_type, redirect_uri, state, scope i response_mode.

  4. Opcjonalnie: określ dodatkowe zakresy OAuth 2.0 poza podstawowym profilem, które których chcesz żądać od dostawcy uwierzytelniania.

    Swift

    provider.scopes = ["mail.read", "calendars.read"]
    

    Objective-C

    [provider setScopes:@[@"mail.read", @"calendars.read"]];
    

    Skontaktuj się z dostawcą, aby uzyskać informacje o obsługiwanych zakresach.

  5. Opcjonalnie: jeśli chcesz dostosować sposób, w jaki aplikacja prezentuje SFSafariViewController lub UIWebView, gdy wyświetlając reCAPTCHA użytkownikowi, utwórz niestandardową klasę spełniającą wymagania na protokół AuthUIDelegate.

  6. Uwierzytelniaj w Firebase za pomocą obiektu dostawcy OAuth.

    Swift

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    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.
          // OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
      }
    }
    

    Objective-C

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    [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.
          // OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
      }
    }];
    
  7. Powyższe przykłady dotyczą procesu logowania, ale masz też możliwość połączenia dostawcy OIDC z istniejącym użytkownikiem za pomocą linkWithCredential 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.

    Swift

    Auth().currentUser.link(withCredential: credential) { authResult, error in
      if error != nil {
        // Handle error.
      }
      // OIDC credential is linked to the current user.
      // IdP data available in authResult.additionalUserInfo.profile.
      // OAuth access token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // OAuth ID token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.idToken
    }
    

    Objective-C

    [[FIRAuth auth].currentUser
        linkWithCredential:credential
                completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      if (error) {
        // Handle error.
      }
      // OIDC credential is linked to the current user.
      // IdP data available in authResult.additionalUserInfo.profile.
      // OAuth access token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    
  8. Tego samego wzoru można użyć w funkcji reauthenticateWithCredential, które mogą być wykorzystywane do: pobieranie nowych danych logowania na potrzeby operacji poufnych, które wymagają ostatnich dane 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 can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // OAuth ID token can also be retrieved:
      // (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 can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    

Zarejestruj się ręcznie

Jeśli masz już wdrożony w aplikacji proces logowania OpenID Connect, mogą używać tokena identyfikatora bezpośrednio do uwierzytelniania w Firebase:

Swift

let credential = OAuthProvider.credential(
    withProviderID: "oidc.example-provider",  // As registered in Firebase console.
    idToken: idToken,  // ID token from OpenID Connect flow.
    rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
    if error {
        // Handle error.
        return
    }
    // User is signed in.
    // IdP data available in authResult?.additionalUserInfo?.profile
}

Objective-C

FIROAuthCredential *credential =
    [FIROAuthProvider credentialWithProviderID:@"oidc.example-provider"  // As registered in Firebase console.
                                       IDToken:idToken  // ID token from OpenID Connect flow.
                                      rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
    if (error != nil) {
        // Handle error.
        return;
    }
    // User is signed in.
    // IdP data available in authResult.additionalUserInfo.profile
}];

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:

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żna także dodać kod obsługi błędów dla pełnego zakresu uwierzytelniania . Patrz Obsługa błędów.