将 Facebook 设置为身份池 IdP
Amazon Cognito 身份池与 Facebook 配合使用,以便针对应用程序用户提供联合身份验证。本部分介绍如何使用 Facebook 作为 IdP 来注册和设置应用程序。
设置 Facebook
在验证 Facebook 用户并与 Facebook API 交互之前,先要向 Facebook 注册您的应用程序。
Facebook 开发人员门户
注意
Amazon Cognito 身份池联合身份验证与 Facebook Limited Login
设置 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 Web 应用程序与 Facebook 登录集成的更多信息,请参阅 Facebook 入门指南
Unity
有关如何将 Unity 应用程序与 Facebook 登录集成的更多信息,请参阅 Facebook 入门指南
Xamarin
要添加 Facebook 身份验证,请首先按照以下相应流程将 Facebook 开发工具包集成到您的应用程序中。Amazon Cognito 身份池使用 Facebook 访问令牌生成与 Amazon Cognito 身份关联的唯一用户标识符。
在 Amazon Cognito 身份池控制台中配置身份提供者
使用以下过程配置身份提供者。
添加 Facebook 身份提供者(IdP)
-
从 Amazon Cognito 控制台
中选择身份池。选择身份池。 -
选择用户访问选项卡。
-
选择添加身份提供者。
-
选择 Facebook。
-
输入您在 Meta for Developers
中创建的 OAuth 项目的应用程序 ID。有关更多信息,请参阅《Meta for Developers 文档》中的 Facebook 登录 。 -
要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置。
-
您可以为该 IdP 中的用户分配您在配置经过身份验证的角色时设置的原定设置角色,也可以使用规则选择角色。
-
如果您选择使用规则选择角色,请输入用户身份验证中的来源声明、您要用来比较声明的运算符、导致与该角色选择匹配的值,以及当角色分配匹配时要分配的角色。选择添加其他,以根据不同的条件创建其他规则。
-
选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。
-
-
-
要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性。
-
如果不应用主体标签,请选择非活动。
-
要基于
sub
和aud
声明应用主体标签,请选择使用原定设置映射。 -
要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键。
-
-
选择保存更改。
使用 Facebook
Android
要添加 Facebook 身份验证,请先按照 Facebook 指南
使用 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 用于为通过身份验证的终端用户生成 Amazon 凭证的 OAuth 令牌。Amazon Cognito 还使用该令牌检查用户数据库,以确定是否存在与此特定 Facebook 身份匹配的用户。如果用户已存在,则 API 会返回现有的标识符。否则,API 将返回新的标识符。客户端开发工具包会自动在本地设备上缓存标识符。
注意
设置登录映射后,调用 refresh
或 get
以检索 Amazon 凭证。
iOS - Objective-C
要添加 Facebook 身份验证,请先按照 Facebook 指南
要向 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
iOS - Swift
要添加 Facebook 身份验证,请先按照 Facebook 指南
注意
Amazon Cognito 身份池联合身份验证与 Facebook Limited Login
要向 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
JavaScript
要添加 Facebook 身份验证,请按照适用于 Web 的 Facebook 登录
使用 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 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 获取 Amazon Cognito 用于为通过身份验证的终端用户生成 Amazon 凭证的 OAuth 令牌。Amazon Cognito 还可以使用该令牌检查用户数据库,以确定是否存在与此特定 Facebook 身份匹配的用户。如果用户已存在,则 API 会返回现有的标识符。否则,将返回新的标识符。标识符由本地设备上的客户端开发工具包自动缓存。
注意
设置登录映射后,请调用 refresh
或 get
以获取凭证。有关代码示例,请参阅 JavaScript 自述文件
Unity
要添加 Facebook 身份验证,请先按照 Facebook 指南FB
对象中的 Facebook 访问令牌生成与 Amazon 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 < 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 } }); }