获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

在 Apple 平台上使用 GitHub 进行身份验证

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以通过使用 Firebase SDK 将通用 OAuth 登录集成到您的应用中来执行端到端登录流程,从而让您的用户使用 GitHub 等 OAuth 提供程序向 Firebase 进行身份验证。

在你开始之前

要使用 GitHub 帐户登录用户,您必须首先启用 GitHub 作为 Firebase 项目的登录提供程序:

使用 Swift Package Manager 安装和管理 Firebase 依赖项。

  1. 在 Xcode 中,打开您的应用项目,导航到File > Add Packages
  2. 出现提示时,添加 Firebase Apple 平台 SDK 存储库:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. 选择 Firebase 身份验证库。
  5. 完成后,Xcode 将在后台自动开始解析和下载您的依赖项。

现在,执行一些配置步骤:

  1. Firebase 控制台中,打开Auth部分。
  2. 登录方法选项卡上,启用GitHub提供程序。
  3. 将该提供者的开发者控制台中的客户端 ID客户端密码添加到提供者配置中:
    1. 在 GitHub 上将您的应用程序注册为开发人员应用程序,并获取您的应用程序的 OAuth 2.0客户端 ID客户端密钥
    2. 确保您的 Firebase OAuth 重定向 URI (例如my-app-12345.firebaseapp.com/__/auth/handler )在GitHub 应用程序的 config的应用程序设置页面中设置为您的授权回调 URL
  4. 单击保存

使用 Firebase SDK 处理登录流程

要使用 Firebase Apple 平台 SDK 处理登录流程,请执行以下步骤:

  1. 将自定义 URL 方案添加到您的 Xcode 项目:

    1. 打开您的项目配置:双击左侧树视图中的项目名称。从TARGETS部分中选择您的应用程序,然后选择Info选项卡,然后展开URL Types部分。
    2. 单击+按钮,并为您的反向客户端 ID 添加 URL 方案。要查找此值,请打开GoogleService-Info.plist配置文件,然后查找REVERSED_CLIENT_ID键。复制该键的值,并将其粘贴到配置页面上的URL 方案框中。将其他字段留空。

      完成后,您的配置应类似于以下内容(但使用特定于应用程序的值):

  2. 使用提供者 ID github.com创建OAuthProvider的实例。

    迅速

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

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
        
  3. 可选:指定要随 OAuth 请求一起发送的其他自定义 OAuth 参数。

    迅速

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

    Objective-C

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

    有关 GitHub 支持的参数,请参阅GitHub OAuth 文档。请注意,您不能使用setCustomParameters传递 Firebase 所需的参数。这些参数是client_idredirect_uriresponse_typescopestate

  4. 可选:指定您希望从身份验证提供程序请求的基本配置文件之外的其他 OAuth 2.0 范围。如果您的应用程序需要从 GitHub API 访问私有用户数据,您需要在 GitHub 开发者控制台的API 权限下请求访问 GitHub API 的权限。请求的 OAuth 范围必须与应用 API 权限中预配置的范围完全匹配。

    迅速

        // 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"]];
        

    要了解更多信息,请参阅GitHub 范围文档

  5. 可选:如果您想自定义应用在向用户显示 reCAPTCHA 时呈现SFSafariViewControllerUIWebView的方式,请创建一个符合FIRAuthUIDelegate协议的自定义类,并将其传递给getCredentialWithUIDelegate:completion:

  6. 使用 OAuth 提供程序对象向 Firebase 进行身份验证。

    迅速

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

    使用 OAuth 访问令牌,您可以调用GitHub API

    例如,要获取基本配置文件信息,您可以调用 REST API,在Authorization标头中传递访问令牌:

    https://api.github.com/user
    
  7. 虽然上述示例侧重于登录流程,但您还可以将 GitHub 提供程序链接到现有用户。例如,您可以将多个提供商链接到同一个用户,允许他们使用其中任何一个登录。

    迅速

        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. 相同的模式可以与reauthenticateWithCredential一起使用,它可用于检索需要最近登录的敏感操作的新凭据。

    迅速

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

下一步

用户首次登录后,会创建一个新用户帐户并将其链接到凭据(即用户名和密码、电话号码或身份验证提供商信息),即用户登录时使用的凭据。这个新帐户作为 Firebase 项目的一部分存储,可用于在项目中的每个应用中识别用户,无论用户如何登录。

  • 在您的应用程序中,您可以从FIRUser对象获取用户的基本个人资料信息。请参阅管理用户

  • 在您的 Firebase 实时数据库和云存储安全规则中,您可以从auth变量中获取登录用户的唯一用户 ID,并使用它来控制用户可以访问哪些数据。

您可以通过将身份验证提供程序凭据链接到现有用户帐户来允许用户使用多个身份验证提供程序登录您的应用程序。

要注销用户,请调用signOut:

迅速

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

您可能还想为所有身份验证错误添加错误处理代码。请参阅处理错误