将 Facebook 设置为身份池 IdP - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 Facebook 设置为身份池 IdP

Amazon Cognito 身份池与 Facebook 合作,为您的应用程序用户提供联合身份验证。本部分介绍如何使用 Facebook 作为 IdP 来注册和设置应用程序。

设置 Facebook

在对 Facebook 用户进行身份验证并与 Facebook 互动之前,请先在 Facebook APIs 上注册

Facebook 开发人员门户可帮助您设置应用程序。在将 Facebook 集成到您的 Amazon Cognito 身份池之前,请执行以下过程:

注意

亚马逊 Cognito 联合身份池与 Facebook Lim ited 登录不兼容。有关如何在不超过限制登录权限的情况下设置 iOS 版 Facebook 登录的更多信息,请参阅 i OS 版 Facebook 登录—— 开发者版元数据上的快速入门

设置 Facebook
  1. Facebook 开发人员门户中,使用 Facebook 凭证登录。

  2. Apps(应用程序)菜单中,选择 Add a New App(添加新应用程序)。

  3. 选择一个平台,然后完成快速启动流程。

Android

有关如何将 Android 应用程序与 Facebook 登录集成的更多信息,请参阅 Facebook 入门指南

iOS - Objective-C

有关如何将 OS Objective-C 应用程序与 Facebook 登录集成的更多信息,请参阅 Facebook 入门指南

iOS - Swift

有关如何将 iOS Swift 应用程序与 Facebook 登录集成的更多信息,请参阅 Facebook 入门指南

JavaScript

有关如何将 JavaScript 网络应用程序与 Facebook 登录集成的更多信息,请参阅 Facebook 入门指南

Unity

有关如何将 Unity 应用程序与 Facebook 登录集成的更多信息,请参阅 Facebook 入门指南

Xamarin

要添加 Facebook 身份验证,请首先按照以下相应流程将 Facebook SDK 集成到您的应用程序中。Amazon Cognito 身份池使用 Facebook 访问令牌生成与 Amazon Cognito 身份关联的唯一用户标识符。

在 Amazon Cognito 身份池控制台中配置身份提供者

使用以下过程配置身份提供者。

添加 Facebook 身份提供者(IdP)
  1. Amazon Cognito 控制台中选择身份池。选择身份池。

  2. 选择用户访问选项卡。

  3. 选择添加身份提供者

  4. 选择 Facebook

  5. 输入你在 Meta 开发者版中创建的OAuth项目的应用程序 ID。有关更多信息,请参阅《Meta for Developers 文档》中的 Facebook 登录

  6. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置

    1. 您可以为该 IdP 中的用户分配您在配置经过身份验证的角色时设置的原定设置角色,也可以使用规则选择角色

      1. 如果您选择使用规则选择角色,请输入用户身份验证中的来源声明、您要用来比较声明的运算符、导致与该角色选择匹配的,以及当角色分配匹配时要分配的角色。选择添加其他,以根据不同的条件创建其他规则。

      2. 选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。

  7. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性

    1. 如果不应用主体标签,请选择非活动

    2. 要基于 subaud 声明应用主体标签,请选择使用原定设置映射

    3. 要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键

  8. 选择保存更改

使用 Facebook

Android

要添加 Facebook 身份验证,请先按照 Facebook 指南进行操作,然后将 Facebook SDK 集成到你的应用程序中。然后,将 Login with Facebook(使用 Facebook 登录)按钮添加到 Android 用户界面。Facebook SDK 使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌对用户进行身份验证,生成唯一标识符,并在需要时授予用户访问其他 AWS 资源的权限。

在 Facebook 上对用户进行身份验证后SDK,将会话令牌添加到 Amazon Cognito 凭证提供商。

Facebook SDK 4.0 或更新版本:

Map<String, String> logins = new HashMap<String, String>(); logins.put("graph.facebook.com", AccessToken.getCurrentAccessToken().getToken()); credentialsProvider.setLogins(logins);

4.0 SDK 之前的脸书:

Map<String, String> logins = new HashMap<String, String>(); logins.put("graph.facebook.com", Session.getActiveSession().getAccessToken()); credentialsProvider.setLogins(logins);

Facebook 登录过程在其中初始化单例会话。SDKFacebook 会话对象包含一个OAuth令牌,Amazon Cognito 使用该令牌为经过身份验证的最终用户生成 AWS 证书。Amazon Cognito 还使用该令牌检查用户数据库,以确定是否存在与此特定 Facebook 身份匹配的用户。如果用户已经存在,则API返回现有的标识符。否则,将API返回一个新的标识符。客户端会SDK自动在本地设备上缓存标识符。

注意

设置登录映射后,调用refreshget以检索 AWS 凭证。

iOS - Objective-C

要添加 Facebook 身份验证,请先按照 Facebook 指南进行操作,然后将 Facebook SDK 集成到你的应用程序中。然后,向用户界面添加“用 Facebook 登录”按钮。Facebook SDK 使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌对用户进行身份验证,并将其绑定到唯一的 Amazon Cognito 身份池(联合身份)。

要向亚马逊 Cognito 提供 Facebook 访问令牌,请实施 AWSIdentityProviderManager协议。

在实施 logins 方法时,返回一个包含 AWSIdentityProviderFacebook 的词典。此词典充当键,而经过身份验证的 Facebook 用户的当前访问令牌充当值,如以下代码示例所示。

- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins { FBSDKAccessToken* fbToken = [FBSDKAccessToken currentAccessToken]; if(fbToken){ NSString *token = fbToken.tokenString; return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : token }]; }else{ return [AWSTask taskWithError:[NSError errorWithDomain:@"Facebook Login" code:-1 userInfo:@{@"error":@"No current Facebook access token"}]]; } }

当您实例化 AWSCognitoCredentialsProvider 时,在构造函数中传递实施 AWSIdentityProviderManager 作为 identityProviderManager 的值的类。有关更多信息,请转到AWSCognitoCredentialsProvider参考页面并选择initWithRegion类型:identityPoolId: identityProviderManager

iOS - Swift

要添加 Facebook 身份验证,请先按照 Facebook 指南进行操作,然后将 Facebook SDK 集成到你的应用程序中。然后,向用户界面添加“用 Facebook 登录”按钮。Facebook SDK 使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌对用户进行身份验证,并将其绑定到唯一的 Amazon Cognito 身份池(联合身份)。

注意

亚马逊 Cognito 联合身份池与 Facebook Lim ited 登录不兼容。有关如何在不超过限制登录权限的情况下设置 iOS 版 Facebook 登录的更多信息,请参阅 i OS 版 Facebook 登录—— 开发者版元数据上的快速入门

要向亚马逊 Cognito 提供 Facebook 访问令牌,请实施 AWSIdentityProviderManager协议。

在实施 logins 方法时,返回一个包含 AWSIdentityProviderFacebook 的词典。此词典充当键,而经过身份验证的 Facebook 用户的当前访问令牌充当值,如以下代码示例所示。

class FacebookProvider: NSObject, AWSIdentityProviderManager { func logins() -> AWSTask<NSDictionary> { if let token = AccessToken.current?.authenticationToken { return AWSTask(result: [AWSIdentityProviderFacebook:token]) } return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"])) } }

当您实例化 AWSCognitoCredentialsProvider 时,在构造函数中传递实施 AWSIdentityProviderManager 作为 identityProviderManager 的值的类。欲了解更多信息,请访问 AWSCognitoCredentialsProvider参考页面并选择initWithRegion类型:identityPoolId: identityProviderManager

JavaScript

要添加 Facebook 身份验证,请按照适用于 Web 的 Facebook 登录中的说明操作,并在您的网站上添加 Login with Facebook (使用 Facebook 登录)按钮。Facebook SDK 使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌对用户进行身份验证,生成唯一标识符,并在需要时授予用户访问其他 AWS 资源的权限。

在 Facebook 上对用户进行身份验证后SDK,将会话令牌添加到 Amazon Cognito 凭证提供商。

FB.login(function (response) { // Check if the user logged in successfully. if (response.authResponse) { console.log('You are now logged in.'); // Add the Facebook access token to the Amazon Cognito credentials login map. AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'IDENTITY_POOL_ID', Logins: { 'graph.facebook.com': response.authResponse.accessToken } }); // Obtain AWS credentials AWS.config.credentials.get(function(){ // Access AWS resources here. }); } else { console.log('There was a problem logging you in.'); } });

Facebook 会SDK获得一个OAuth令牌,亚马逊 Cognito 使用该令牌为经过身份验证的最终用户 AWS 生成凭证。Amazon Cognito 还可以使用该令牌检查用户数据库,以确定是否存在与此特定 Facebook 身份匹配的用户。如果用户已经存在,则API返回现有的标识符。否则,将返回新的标识符。标识符由客户端自动缓存在本地设备SDK上。

Unity

要添加 Facebook 身份验证,请先按照 Facebook 指南进行操作,然后将 Facebook SDK 集成到你的应用程序中。Amazon Cognito 使用 FB 对象中的 Facebook 访问令牌生成与 Amazon Cognito 身份关联的唯一用户标识符。

在 Facebook 上对用户进行身份验证后SDK,将会话令牌添加到 Amazon Cognito 凭证提供商:

void Start() { FB.Init(delegate() { if (FB.IsLoggedIn) { //User already logged in from a previous session AddFacebookTokenToCognito(); } else { FB.Login ("email", FacebookLoginCallback); } }); } void FacebookLoginCallback(FBResult result) { if (FB.IsLoggedIn) { AddFacebookTokenToCognito(); } else { Debug.Log("FB Login error"); } } void AddFacebookTokenToCognito() { credentials.AddLogin ("graph.facebook.com", AccessToken.CurrentAccessToken.TokenString); }

使用 FB.AccessToken 之前,调用 FB.Login() 并确保 FB.IsLoggedIn 为 True。

Xamarin

Xamarin for Android:

public void InitializeFacebook() { FacebookSdk.SdkInitialize(this.ApplicationContext); callbackManager = CallbackManagerFactory.Create(); LoginManager.Instance.RegisterCallback(callbackManager, new FacebookCallback &lt; LoginResult &gt; () { HandleSuccess = loginResult = &gt; { var accessToken = loginResult.AccessToken; credentials.AddLogin("graph.facebook.com", accessToken.Token); //open new activity }, HandleCancel = () = &gt; { //throw error message }, HandleError = loginError = &gt; { //throw error message } }); LoginManager.Instance.LogInWithReadPermissions(this, new List &lt; string &gt; { "public_profile" }); }

Xamarin for iOS:

public void InitializeFacebook() { LoginManager login = new LoginManager(); login.LogInWithReadPermissions(readPermissions.ToArray(), delegate(LoginManagerLoginResult result, NSError error) { if (error != null) { //throw error message } else if (result.IsCancelled) { //throw error message } else { var accessToken = loginResult.AccessToken; credentials.AddLogin("graph.facebook.com", accessToken.Token); //open new view controller } }); }