Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Facebook

Amazon Cognito 与 Facebook 集成以针对移动应用程序用户提供联合身份验证。本部分介绍了如何使用 Facebook 作为身份提供商来注册和设置应用程序。

设置 Facebook

您需要先使用 Facebook 注册应用程序,然后才能开始对 Facebook 用户进行身份验证并与 Facebook API 进行交互。

Facebook 开发人员门户将指导您完成设置应用程序的流程。如果您尚未完成该流程,则需要先进行设置,然后才能在 Amazon Cognito 身份池中集成 Facebook:

设置 Facebook

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

  2. Apps 菜单中,选择 Add a New App

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

Android

Facebook 入门指南提供了有关与 Facebook 登录集成的更多信息。

iOS - Objective-C

Facebook 入门指南提供了有关与 Facebook 登录集成的更多信息。

iOS - Swift

Facebook 入门指南提供了有关与 Facebook 登录集成的更多信息。

JavaScript

Facebook 入门指南提供了有关与 Facebook 登录集成的更多信息。

Unity

Facebook 入门指南提供了有关与 Facebook 登录集成的更多信息。

Xamarin

要提供 Facebook 身份验证,请先按照以下相应的流程在应用程序中添加和设置 Facebook 开发工具包。Amazon Cognito 使用 Facebook 访问令牌生成与 Cognito 身份关联的唯一用户标识符。

在 Amazon Cognito 控制台中配置外部提供商

Amazon Cognito 控制台主页

  1. 选择 Manage Federated Identities

  2. 选择想要针对其启用 Facebook 作为外部提供商的身份池的名称。此时将显示身份池的 Dashboard 页。

  3. Dashboard 页的右上角,选择 Edit identity pool。此时将显示 Edit identity pool 页。

  4. 向下滚动并选择 Authentication providers 以将其展开。

  5. 选择 Facebook 选项卡。

  6. 选择 Unlock

  7. 输入您从 Facebook 获取的 Facebook 应用程序 ID,然后选择 Save Changes

使用 Facebook

Android

要提供 Facebook 身份验证,请先按照 Facebook 指南将其开发工具包添加到应用程序中。然后,将“Login with Facebook”按钮添加到 Android 用户界面。Facebook 开发工具包使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌来对用户进行身份验证、生成唯一标识符,并根据需要授予用户对其他 AWS 资源的访问权限。

使用 Facebook 开发工具包对用户进行身份验证后,立即将会话令牌添加到 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);

Facebook SDK 4.0 之前的版本:

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

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

注意

设置登录映射后,您将需要调用 refreshget 以实际获取 AWS 凭证。

iOS - Objective-C

要添加 Facebook 身份验证,请先按照 Facebook 指南将 Facebook 开发工具包集成到应用程序中。然后,向用户界面添加“Login with Facebook”按钮。Facebook 开发工具包使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌来对用户进行身份验证,并将用户绑定到唯一的 Amazon Cognito 身份。

要向 Amazon 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 参考页面,并选择 initWithRegionType:identityPoolId:identityProviderManager

iOS - Swift

要添加 Facebook 身份验证,请先按照 Facebook 指南将 Facebook 开发工具包集成到应用程序中。然后,向用户界面添加“Login with Facebook”按钮。Facebook 开发工具包使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌来对用户进行身份验证,并将用户绑定到唯一的 Amazon Cognito 身份。

要向 Amazon 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 参考页面,并选择 initWithRegionType:identityPoolId:identityProviderManager

JavaScript

要提供 Facebook 身份验证,请按照适用于 Web 的 Facebook 登录在您的网站上添加“Login with Facebook”按钮。Facebook 开发工具包使用会话对象来跟踪其状态。Amazon Cognito 使用来自此会话对象的访问令牌来对用户进行身份验证、生成唯一标识符,并根据需要授予用户对其他 AWS 资源的访问权限。

使用 Facebook 开发工具包对用户进行身份验证后,立即将会话令牌添加到 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 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 开发工具包获取 Amazon Cognito 用于为通过身份验证的最终用户生成 AWS 凭证的 OAuth 令牌。Amazon Cognito 还可以使用令牌来检查用户数据库,以确定是否存在与此特定 Facebook 身份匹配的用户。如果用户已存在,则 API 会返回现有的标识符。否则,将返回新的标识符。标识符由本地设备上的客户端开发工具包自动缓存。

注意

设置登录映射后,您需要调用 refreshget 以获取 AWS 凭证。有关代码示例,请参阅 JavaScript 自述文件中的“使用案例 17:将用户池与 Cognito 身份集成”。

Unity

要提供 Facebook 身份验证,请先按照 Facebook 指南将其开发工具包添加到应用程序中并对其进行设置。Amazon Cognito 使用来自“FB”对象的 Facebook 访问令牌生成与 Cognito 身份关联的唯一用户标识符。

使用 Facebook 开发工具包对用户进行身份验证后,立即将会话令牌添加到 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 } }); }