Facebook(身份池)
Amazon Cognito 身份池与 Facebook 集成以针对移动应用程序用户提供联合身份验证。本部分介绍了如何使用 Facebook 作为身份提供商来注册和设置应用程序。
设置 Facebook
您需要先使用 Facebook 注册应用程序,然后才能开始对 Facebook 用户进行身份验证并与 Facebook API 进行交互。
Facebook 开发人员门户
设置 Facebook
-
在 Facebook 开发人员门户
中,使用 Facebook 凭证登录。 -
从 Apps (应用程序) 菜单中,选择 Add a New App (添加新应用程序)。
-
选择一个平台,然后完成快速启动流程。
Android
Facebook 入门指南
iOS - Objective-C
Facebook 入门指南
iOS - Swift
Facebook 入门指南
JavaScript
Facebook 入门指南
Unity
Facebook 入门指南
Xamarin
要提供 Facebook 身份验证,请先按照以下相应的流程在应用程序中添加和设置 Facebook SDK。Amazon Cognito 身份池使用 Facebook 访问令牌生成与 Amazon Cognito 身份关联的唯一用户标识符。
在 Amazon Cognito 联合身份控制台中配置外部提供商
使用以下过程可以配置外部提供商。
-
在 Amazon Cognito 控制台主页
中选择 Manage Identity Pools (管理身份池)。 -
选择想要针对其启用 Facebook 作为外部提供商的身份池的名称。此时将显示身份池的控制面板页。
-
在控制面板页面的右上角,选择 Edit identity pool (编辑身份池)。此时将显示编辑身份池页。
-
向下滚动并选择身份验证提供商以将其展开。
-
选择 Facebook 选项卡。
-
选择解锁。
-
输入您从 Facebook 获取的 Facebook 应用程序 ID,然后选择保存更改。
使用 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);
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 会返回现有的标识符。否则,将返回新的标识符。标识符由本地设备上的客户端开发工具包自动缓存。
设置登录映射后,必须调用 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 参考页面,并选择 initWithRegionType:identityPoolId:identityProviderManager。
iOS - Swift
要添加 Facebook 身份验证,请先按照 Facebook 指南
要向 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 登录
使用 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 获取 Amazon Cognito 用于为通过身份验证的终端用户生成Amazon凭证的 OAuth 令牌。Amazon Cognito 还可以使用该令牌检查用户数据库,以确定是否存在与此特定 Facebook 身份匹配的用户。如果用户已存在,则 API 会返回现有的标识符。否则,将返回新的标识符。标识符由本地设备上的客户端开发工具包自动缓存。
设置登录映射后,必须调用 refresh
或 get
以获取凭证。有关代码示例,请参阅 JavaScript 自述文件
Unity
要提供 Facebook 身份验证,请先按照 Facebook 指南
使用 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.Login()
之前,您应该确保调用 FB.IsLoggedIn
并确保 FB.AccessToken
为 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 } }); }