Naar console

在 iOS 上使用 GitHub 进行身份验证

要让您的用户能够通过 OAuth 提供方(如 Github)进行 Firebase 身份验证,您可以使用 Firebase SDK 执行端到端登录流程,将通用 OAuth 登录机制集成到您的应用中。

准备工作

要让用户能够通过 GitHub 帐号登录,您必须先启用 GitHub,使其作为您的 Firebase 项目的登录服务提供方:

  1. 将 Firebase 添加到您的 iOS 项目
    pod 'Firebase/Auth'
  2. Firebase 控制台中,打开身份验证部分。
  3. 登录方法标签页中,启用 GitHub 提供方。
  4. 将该提供方的开发者控制台中的客户端 ID客户端密文添加至提供方配置:
    1. 在 GitHub 上将您的应用注册为开发者应用,并为其获取 OAuth 2.0 客户端 ID客户端密文
    2. 请务必在您的 GitHub 应用配置的应用设置页面中,将 Firebase OAuth 重定向 URI(例如 my-app-12345.firebaseapp.com/__/auth/handler)设置为授权回调网址
  5. 点击保存

使用 Firebase SDK 处理登录流程

要使用 Firebase iOS SDK 处理登录流程,请按以下步骤操作:

  1. 将自定义网址架构添加至您的 Xcode 项目中:

    1. 打开您的项目配置:在左侧的树状视图中双击项目名称。从目标部分中选择您的应用,然后选择信息标签页,并展开网址类型部分。
    2. 点击 + 按钮,并为您的倒序客户端 ID 添加一个网址架构。要找到这个值,请打开 GoogleService-Info.plist 配置文件,然后查找 REVERSED_CLIENT_ID 键。复制该键的值,并将其粘贴到配置页面上的 URL Schemes 框中。将其他字段留空。

      完成上述操作后,您的配置应显示如下(但其中的值应替换为您的应用的值):

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

    Swift

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

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
        
  3. 可选:指定您希望通过 OAuth 请求发送的其他自定义 OAuth 参数。

    Swift

        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 权限中预配置的范围完全匹配。

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

    要了解详情,请参阅 Github 范围文档

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

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

    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.
              // GitHub OAuth access token can also be retrieved by:
              // authResult.credential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // authResult.credential.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.
              // GitHub OAuth access token can also be retrieved by:
              // authResult.credential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // authResult.credential.idToken
            }];
          }
        }];
        

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

    例如,要获取个人资料基本信息,可以调用 REST API 以传递 Authorization 标头中的访问令牌:

    https://api.github.com/user
    
  7. 以上示例侧重的是登录流程。除此之外,您也可以将 GitHub 提供方与现有用户相关联。例如,您可以将多个提供方关联至同一个用户,以便使用任意一个进行登录。

    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.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.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:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }];
        
  8. 上述格式同样适用于 reauthenticateWithCredential,它的作用包括:对于要求用户必须有近期登录才能执行的敏感操作,可使用它检索新的凭据。

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

后续步骤

在用户首次登录后,系统会创建一个新的用户帐号,并将其与该用户登录时使用的凭据(即用户名、密码、电话号码或者身份验证提供方信息)相关联。此新帐号存储为您的 Firebase 项目的一部分,无论用户采用何种方式登录,您项目中的每个应用都可以使用此帐号来识别用户。

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

  • 在您的 Firebase 实时数据库和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后用其控制用户可以访问哪些数据。

您可以通过将身份验证提供方凭据关联至现有用户帐号,让用户可以使用多个身份验证提供方登录您的应用。

如需让用户退出登录,请调用 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;
}

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