使用 Yahoo 进行身份验证(Apple 平台)

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

准备工作

如需让用户能够通过 Yahoo 账号登录,您必须先启用 Yahoo 作为您的 Firebase 项目的登录服务提供方:

  1. 将 Firebase 添加到您的 Apple 项目
  2. Firebase 控制台中,打开 Auth 部分。
  3. 登录方法标签页中,启用 Yahoo 提供方。
  4. 将该提供方的开发者控制台中的客户端 ID客户端密钥添加至提供方配置:
    1. 如需注册 Yahoo OAuth 客户端,请按照有关如何通过 Yahoo 注册 Web 应用的 Yahoo 开发者文档进行操作。

      请务必选择以下两种 OpenID Connect API 权限:profileemail

    2. 向这些提供方注册应用时,请务必将项目的 *.firebaseapp.com 网域注册为应用的重定向网域。
  5. 点击保存

使用 Firebase SDK 处理登录流程

如需使用 Firebase Apple 平台 SDK 处理登录流程,请按以下步骤操作:

  1. 将自定义网址方案 (URL scheme) 添加至 Xcode 项目中:

    1. 打开项目配置:在左侧的树状视图中双击项目名称。在目标部分中选择您的应用,然后选择信息标签页,并展开网址类型部分。
    2. 点击 + 按钮,然后将经过编码的应用 ID 添加为网址方案。您可以打开 Firebase 控制台的常规设置页面,在您的 iOS 应用部分找到经过编码的应用 ID。请将其他字段留空。

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

      Xcode 自定义网址方案设置界面的屏幕截图

  2. 使用提供方 ID OAuthProvider 创建一个 OAuthProvider 实例。

    Swift

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

    Objective-C

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

    Swift

    provider.customParameters = [
    "prompt": "login",
    "language": "fr"
    ]
        

    Objective-C

    [provider setCustomParameters:@{@"prompt": @"login", @"language": @"fr"}];
        

    如需查看 Yahoo 支持的参数,请参阅 Yahoo OAuth 文档。 请注意,您不能使用 setCustomParameters 传递 Firebase 必需的参数。这些参数包括 client_idredirect_uriresponse_typescopestate

  4. 可选:指定您希望向身份验证提供方申请的 profileemail 之外的 OAuth 2.0 范围。如果您的应用需要通过 Yahoo API 访问用户私人数据,您需要在 Yahoo 开发者控制台的 API 权限下申请 Yahoo API 权限。申请的 OAuth 范围必须与应用的 API 权限中预配置的范围完全匹配。例如,如果您申请了对用户通讯录的读写权限,并已在应用的 API 权限中预配置相应权限,则必须传递 sdct-w 而不是只读 OAuth 范围 sdct-r。否则将导致流程失败,并向最终用户显示错误消息。

    Swift

    // Request access to Yahoo Mail API.
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = ["mail-r", "sdct-w"]
        

    Objective-C

    // Request access to Yahoo Mail API.
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    [provider setScopes:@[@"mail-r", @"sdct-w"]];
        

    如需了解详情,请参阅 Yahoo 范围文档

  5. 可选:如果您希望自定义应用在向用户显示 reCAPTCHA 时如何呈现 SFSafariViewControllerUIWebView,请创建一个符合 AuthUIDelegate 协议的自定义类,并将其传递给 credentialWithUIDelegate

  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.
      // Yahoo OAuth access token can also be retrieved by:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // Yahoo OAuth ID token can be retrieved by calling:
      // (authResult.credential as? 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.
      // Yahoo OAuth access token can also be retrieved by:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // Yahoo OAuth ID token can be retrieved by calling:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    }
    }];
        

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

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

    https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json
    

    其中,YAHOO_USER_UID 是 Yahoo 用户的 ID,可以从 Auth.auth.currentUser.providerData[0].uid 字段或 authResult.additionalUserInfo.profile 检索。

  7. 以上示例侧重的是登录流程。除此之外,您也可以使用 linkWithPopup 将 Yahoo 提供方与现有用户相关联。例如,您可以将多个提供方关联至同一个用户,让用户可以使用任意一个提供方进行登录。

    Swift

    Auth().currentUser.link(withCredential: credential) { authResult, error in
    if error != nil {
    // Handle error.
    }
    // Yahoo credential is linked to the current user.
    // IdP data available in authResult.additionalUserInfo.profile.
    // Yahoo OAuth access token can also be retrieved by:
    // (authResult.credential as? OAuthCredential)?.accessToken
    // Yahoo 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.
    }
    // Yahoo credential is linked to the current user.
    // IdP data available in authResult.additionalUserInfo.profile.
    // Yahoo OAuth access token is can also be retrieved by:
    // ((FIROAuthCredential *)authResult.credential).accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // ((FIROAuthCredential *)authResult.credential).idToken
    }];
        
  8. 上述模式同样适用于 reauthenticateWithPopup/reauthenticateWithRedirect。对于要求用户必须在近期内登录过才能执行的敏感操作,可使用它来检索新的凭据。

    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 as? OAuthCredential)?.accessToken
    // Yahoo 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
    // Yahoo OAuth ID token can be retrieved by calling:
    // ((FIROAuthCredential *)authResult.credential).idToken
    }];
        

后续步骤

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

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

  • 在您的 Firebase Realtime DatabaseCloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后利用此 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;
}

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