了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

Authentifizieren Sie sich mit GitHub auf Apple-Plattformen

Sie können Ihren Benutzern ermöglichen, sich bei Firebase mit OAuth-Anbietern wie GitHub zu authentifizieren, indem Sie die generische OAuth-Anmeldung mithilfe des Firebase SDK in Ihre App integrieren, um den End-to-End-Anmeldeablauf durchzuführen.

Bevor Sie beginnen

Um Benutzer mit GitHub-Konten anzumelden, müssen Sie zunächst GitHub als Anmeldeanbieter für Ihr Firebase-Projekt aktivieren:

Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.

  1. Navigieren Sie in Xcode bei geöffnetem App-Projekt zu File > Add Packages .
  2. Wenn Sie dazu aufgefordert werden, fügen Sie das Firebase Apple-Plattform-SDK-Repository hinzu:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Wählen Sie die Firebase-Authentifizierungsbibliothek aus.
  5. Wenn Sie fertig sind, beginnt Xcode automatisch mit dem Auflösen und Herunterladen Ihrer Abhängigkeiten im Hintergrund.

Führen Sie nun einige Konfigurationsschritte durch:

  1. Öffnen Sie in der Firebase-Konsole den Abschnitt Auth .
  2. Aktivieren Sie auf der Registerkarte Anmeldemethode den GitHub- Anbieter.
  3. Fügen Sie die Client-ID und das Client-Geheimnis aus der Entwicklerkonsole dieses Anbieters zur Anbieterkonfiguration hinzu:
    1. Registrieren Sie Ihre App als Entwickleranwendung auf GitHub und erhalten Sie die OAuth 2.0- Client-ID und das Clientgeheimnis Ihrer App.
    2. Stellen Sie sicher, dass Ihr Firebase- OAuth-Umleitungs-URI (z. B. my-app-12345.firebaseapp.com/__/auth/handler ) als Rückruf-URL für die Autorisierung auf der Einstellungsseite Ihrer App in der Konfiguration Ihrer GitHub-App festgelegt ist.
  4. Klicken Sie auf Speichern .

Behandeln Sie den Anmeldevorgang mit dem Firebase SDK

Führen Sie die folgenden Schritte aus, um den Anmeldevorgang mit dem Firebase-Apple-Plattform-SDK zu verarbeiten:

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

    1. Öffnen Sie Ihre Projektkonfiguration: Doppelklicken Sie in der linken Baumansicht auf den Projektnamen. Wählen Sie Ihre App aus dem Abschnitt ZIELE aus, wählen Sie dann die Registerkarte Info und erweitern Sie den Abschnitt URL-Typen .
    2. Klicken Sie auf die Schaltfläche + und fügen Sie Ihre codierte App-ID als URL-Schema hinzu. Sie finden Ihre verschlüsselte App-ID auf der Seite „Allgemeine Einstellungen“ der Firebase-Konsole im Abschnitt für Ihre iOS-App. Lassen Sie die anderen Felder leer.

      Wenn Sie fertig sind, sollte Ihre Konfiguration ungefähr so ​​aussehen (aber mit Ihren anwendungsspezifischen Werten):

      Screenshot der benutzerdefinierten URL-Schema-Setup-Oberfläche von Xcode

  2. Erstellen Sie eine Instanz eines OAuthProviders mit der Anbieter-ID github.com .

    Schnell

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

    Ziel c

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

    Schnell

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

    Ziel c

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

    Informationen zu den von GitHub unterstützten Parametern finden Sie in der GitHub OAuth-Dokumentation . Beachten Sie, dass Sie für Firebase erforderliche Parameter nicht mit setCustomParameters übergeben können. Diese Parameter sind client_id , relay_uri , response_type , scope und state .

  4. Optional : Geben Sie zusätzliche OAuth 2.0-Bereiche über das Basisprofil hinaus an, die Sie vom Authentifizierungsanbieter anfordern möchten. Wenn Ihre Anwendung Zugriff auf private Benutzerdaten von GitHub-APIs erfordert, müssen Sie Berechtigungen für den Zugriff auf GitHub-APIs unter API-Berechtigungen in der GitHub-Entwicklerkonsole anfordern. Angeforderte OAuth-Bereiche müssen genau mit den vorkonfigurierten in den API-Berechtigungen der App übereinstimmen.

    Schnell

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

    Ziel c

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

    Weitere Informationen finden Sie in der GitHub-Dokumentation zu Bereichen .

  5. Optional : Wenn Sie die Art und Weise anpassen möchten, wie Ihre App den SFSafariViewController oder UIWebView darstellt, wenn sie dem Benutzer das reCAPTCHA anzeigt, erstellen Sie eine benutzerdefinierte Klasse, die dem AuthUIDelegate Protokoll entspricht, und übergeben Sie sie an credentialWithUIDelegate .

  6. Authentifizieren Sie sich bei Firebase mithilfe des OAuth-Anbieterobjekts.

    Schnell

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

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

    Mit dem OAuth-Zugriffstoken können Sie die GitHub-API aufrufen.

    Um beispielsweise grundlegende Profilinformationen abzurufen, können Sie die REST-API aufrufen und das Zugriffstoken im Authorization Header übergeben:

    https://api.github.com/user
    
  7. Während sich die obigen Beispiele auf Anmeldeabläufe konzentrieren, haben Sie auch die Möglichkeit, einen GitHub-Anbieter mit einem vorhandenen Benutzer zu verknüpfen. Beispielsweise können Sie mehrere Anbieter mit demselben Benutzer verknüpfen, sodass er sich bei beiden anmelden kann.

    Schnell

        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
        }
        

    Ziel 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. Dasselbe Muster kann mit reauthenticateWithCredential verwendet werden, mit dem neue Anmeldeinformationen für vertrauliche Vorgänge abgerufen werden können, die eine kürzlich erfolgte Anmeldung erfordern.

    Schnell

        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
        }
        

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

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen verknüpft – d. h. dem Benutzernamen und Kennwort, der Telefonnummer oder den Authentifizierungsanbieterinformationen –, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Benutzers aus dem User abrufen. Siehe Benutzer verwalten .

  • In Ihren Sicherheitsregeln für die Firebase-Echtzeitdatenbank und den Cloud-Speicher können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der Variablen auth abrufen und damit steuern, auf welche Daten ein Benutzer zugreifen kann.

Sie können Benutzern erlauben, sich mit mehreren Authentifizierungsanbietern bei Ihrer App anzumelden, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen.

Um einen Benutzer abzumelden, rufen Sie signOut: auf.

Schnell

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

Ziel c

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

Möglicherweise möchten Sie auch Fehlerbehandlungscode für alle Authentifizierungsfehler hinzufügen. Siehe Behandlung von Fehlern .