本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 Facebook 设置为身份池 IdP
Amazon Cognito 身份池与 Facebook 合作,为您的应用程序用户提供联合身份验证。本部分介绍如何使用 Facebook 作为 IdP 来注册和设置应用程序。
设置 Facebook
在对 Facebook 用户进行身份验证并与 Facebook 互动之前,请先在 Facebook APIs 上注册
Facebook 开发人员门户
注意
亚马逊 Cognito 联合身份池与 Facebook Lim
设置 Facebook
-
在 Facebook 开发人员门户
中,使用 Facebook 凭证登录。 -
从 Apps(应用程序)菜单中,选择 Add a New App(添加新应用程序)。
-
选择一个平台,然后完成快速启动流程。
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)
-
从 Amazon Cognito 控制台
中选择身份池。选择身份池。 -
选择用户访问选项卡。
-
选择添加身份提供者。
-
选择 Facebook。
-
输入你在 Meta 开发者版中创建的OAuth
项目的应用程序 ID。有关更多信息,请参阅《Meta for Developers 文档》中的 Facebook 登录 。 -
要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置。
-
您可以为该 IdP 中的用户分配您在配置经过身份验证的角色时设置的原定设置角色,也可以使用规则选择角色。
-
如果您选择使用规则选择角色,请输入用户身份验证中的来源声明、您要用来比较声明的运算符、导致与该角色选择匹配的值,以及当角色分配匹配时要分配的角色。选择添加其他,以根据不同的条件创建其他规则。
-
选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。
-
-
-
要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性。
-
如果不应用主体标签,请选择非活动。
-
要基于
sub
和aud
声明应用主体标签,请选择使用原定设置映射。 -
要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键。
-
-
选择保存更改。
使用 Facebook
Android
要添加 Facebook 身份验证,请先按照 Facebook 指南
在 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自动在本地设备上缓存标识符。
注意
设置登录映射后,调用refresh
或get
以检索 AWS 凭证。
iOS - Objective-C
要添加 Facebook 身份验证,请先按照 Facebook 指南
要向亚马逊 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
iOS - Swift
要添加 Facebook 身份验证,请先按照 Facebook 指南
注意
亚马逊 Cognito 联合身份池与 Facebook Lim
要向亚马逊 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
JavaScript
要添加 Facebook 身份验证,请按照适用于 Web 的 Facebook 登录
在 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上。
注意
设置登录映射后,请调用 refresh
或 get
以获取凭证。有关代码示例,请参阅文件中的 “用例 17,将用户池与 Cognito Identity 集成”。JavaScript README
Unity
要添加 Facebook 身份验证,请先按照 Facebook 指南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 < LoginResult > () { HandleSuccess = loginResult = > { var accessToken = loginResult.AccessToken; credentials.AddLogin("graph.facebook.com", accessToken.Token); //open new activity }, HandleCancel = () = > { //throw error message }, HandleError = loginError = > { //throw error message } }); LoginManager.Instance.LogInWithReadPermissions(this, new List < string > { "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 } }); }