Mit OpenID Connect auf Apple-Plattformen authentifizieren

Wenn Sie auf Firebase Authentication with Identity Platform umgestellt haben, können Sie Ihre Nutzer mit Firebase authentifizieren. Verwenden Sie dazu den OpenID Connect-kompatiblen (OIDC) Anbieter Ihrer Wahl. So können Sie Identitätsanbieter verwenden, die von Firebase nicht nativ unterstützt werden.

Hinweis

Wenn Sie Nutzer mit einem OIDC-Anbieter anmelden möchten, müssen Sie zuerst einige Informationen vom Anbieter erheben:

  • Client-ID: Ein String, der für den Anbieter eindeutig ist und Ihre App identifiziert. Ihr Anbieter weist Ihnen möglicherweise für jede unterstützte Plattform eine andere Client-ID zu. Dies ist einer der Werte der aud-Anforderung in ID-Tokens, die von Ihrem Anbieter ausgestellt werden.

  • Clientschlüssel: Ein geheimer String, mit dem der Anbieter das Eigentum an einer Client-ID bestätigt. Für jede Client-ID benötigen Sie einen passenden Clientschlüssel. Dieser Wert ist nur erforderlich, wenn Sie den Autorisierungscode-Prozess verwenden. Das wird dringend empfohlen.

  • Aussteller: Ein String, der Ihren Anbieter identifiziert. Dieser Wert muss eine URL sein, die, wenn sie mit /.well-known/openid-configuration angehängt wird, den Speicherort des OIDC-Discovery-Dokuments des Anbieters angibt. Wenn der Aussteller beispielsweise https://auth.example.com ist, muss das Discovery-Dokument unter https://auth.example.com/.well-known/openid-configuration verfügbar sein.

Nachdem Sie die oben genannten Informationen haben, aktivieren Sie OpenID Connect als Anmeldeanbieter für Ihr Firebase-Projekt:

  1. Fügen Sie Ihrem iOS-Projekt Firebase hinzu.

  2. Wenn Sie noch nicht auf Firebase Authentication with Identity Platform umgestellt haben, tun Sie das jetzt. Die OpenID Connect-Authentifizierung ist nur in aktualisierten Projekten verfügbar.

  3. Klicken Sie in der Firebase Console auf der Anmeldeanbieter Seite auf Neuen Anbieter hinzufügen und dann auf OpenID Connect.

  4. Wählen Sie aus, ob Sie den Autorisierungscode-Prozess oder den impliziten Berechtigungsprozess verwenden möchten.

    Verwenden Sie immer den Autorisierungscode-Prozess, wenn Ihr Anbieter ihn unterstützt. Der implizite Prozess ist weniger sicher und wird daher nicht empfohlen.

  5. Geben Sie einen Namen für diesen Anbieter an. Notieren Sie sich die generierte Anbieter-ID, z. B. oidc.example-provider. Sie benötigen diese ID, wenn Sie Ihrer App Anmeldecode hinzufügen.

  6. Geben Sie Ihre Client-ID und Ihren Clientschlüssel sowie den Ausstellerstring Ihres Anbieters an. Diese Werte müssen genau mit den Werten übereinstimmen, die Ihnen Ihr Anbieter zugewiesen hat.

  7. Speichern Sie die Änderungen.

Anmeldeprozess mit dem Firebase SDK verarbeiten

Die einfachste Möglichkeit, Ihre Nutzer mit Firebase über Ihren OIDC-Anbieter zu authentifizieren, besteht darin, den gesamten Anmeldeprozess mit dem Firebase SDK zu verarbeiten.

So verarbeiten Sie den Anmeldeprozess mit dem Firebase Apple Platforms SDK:

  1. Fügen Sie Ihrem Xcode-Projekt benutzerdefinierte URL-Schemes hinzu:

    1. Öffnen Sie die Projektkonfiguration. Doppelklicken Sie dazu in der linken Baumansicht auf den Projektnamen. Wählen Sie im Abschnitt TARGETS (Ziele) Ihre App aus, wählen Sie dann den Tab Info aus und maximieren Sie den Abschnitt URL Types (URL-Typen).
    2. Klicken Sie auf die Schaltfläche + und fügen Sie Ihre codierte App-ID als URL Scheme hinzu. Sie finden Ihre codierte App-ID in der Firebase Console auf der Seite „Allgemeine Einstellungen“ im Abschnitt für Ihre iOS -App. Lassen Sie die anderen Felder leer.

      Ihre Konfiguration sollte anschließend in etwa so aussehen (aber mit Ihren anwendungsspezifischen Werten):

      Screenshot der Benutzeroberfläche von Xcode zum Einrichten eines benutzerdefinierten URL-Schemas
  2. Erstellen Sie eine Instanz von OAuthProvider mit der Anbieter-ID, die Sie in der Firebase Console erhalten haben.

    Swift

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

    Objective-C

    FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];
    
  3. Optional: Geben Sie zusätzliche benutzerdefinierte OAuth-Parameter an, die Sie mit der OAuth-Anfrage senden möchten.

    Swift

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

    Objective-C

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

    Erkundigen Sie sich bei Ihrem Anbieter nach den unterstützten Parametern. Beachten Sie, dass Sie mit setCustomParameters keine für Firebase erforderlichen Parameter übergeben können. Diese Parameter sind client_id, response_type, redirect_uri, state, scope und response_mode.

  4. Optional: Geben Sie zusätzliche OAuth 2.0-Bereiche über das grundlegende Profil hinaus an, die Sie vom Authentifizierungsanbieter anfordern möchten.

    Swift

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

    Objective-C

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

    Erkundigen Sie sich bei Ihrem Anbieter nach den unterstützten Bereichen.

  5. Optional: Wenn Sie anpassen möchten, wie Ihre App SFSafariViewController oder UIWebView darstellt, wenn das reCAPTCHA dem Nutzer angezeigt wird, erstellen Sie eine benutzerdefinierte Klasse, die dem AuthUIDelegate Protokoll entspricht.

  6. Authentifizieren Sie sich mit Firebase über das OAuth-Anbieterobjekt.

    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. In den obigen Beispielen geht es um Anmeldeprozesse. Sie können aber auch einen OIDC-Anbieter mit linkWithCredential mit einem vorhandenen Nutzer verknüpfen. So können Sie beispielsweise mehrere Anbieter mit demselben Nutzer verknüpfen, damit er sich mit beiden anmelden kann.

    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. Dasselbe Muster kann mit reauthenticateWithCredential verwendet werden. Damit lassen sich neue Anmeldedaten für vertrauliche Vorgänge abrufen, für die eine aktuelle Anmeldung erforderlich ist.

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

Anmeldeprozess manuell verarbeiten

Wenn Sie den OpenID Connect-Anmeldeprozess bereits in Ihrer App implementiert haben, können Sie das ID-Token direkt verwenden, um sich bei Firebase zu authentifizieren:

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

Nächste Schritte

Wenn sich ein Nutzer zum ersten Mal anmeldet, wird ein neues Nutzerkonto erstellt und mit den Anmeldedaten verknüpft, mit denen sich der Nutzer angemeldet hat. Das können der Nutzername und das Passwort, die Telefonnummer oder die Informationen des Authentifizierungsanbieters sein. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps Ihres Projekts zu identifizieren, unabhängig davon, wie sich der Nutzer anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Nutzers aus dem User -Objekt abrufen. Weitere Informationen finden Sie unter Nutzer verwalten.

  • In den Firebase Realtime Database und Cloud Storage Sicherheitsregeln können Sie die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen auth abrufen und damit steuern, auf welche Daten ein Nutzer zugreifen kann.

Sie können Nutzern erlauben, sich mit mehreren Authentifizierungs anbietern in Ihrer App anzumelden. Verknüpfen Sie dazu die Anmeldedaten des Authentifizierungsanbieters mit einem vorhandenen Nutzerkonto.

Rufen Sie signOut: auf, um einen Nutzer abzumelden.

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

Sie können auch Code zur Fehlerbehandlung für alle Authentifizierungs fehler hinzufügen. Weitere Informationen finden Sie unter Fehler behandeln.