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

教程:为 iOS 应用程序集成用户池

本教程将帮助您开始使用用户池。

步骤 1:使用控制台为应用程序创建用户池

以下过程介绍如何创建用户池以及如何在应用程序中使用用户池。此过程将使用默认设置创建一个池 ID、一个应用程序客户端 ID 和一个应用程序客户端密钥。有关自定义这些设置的信息,请参阅用户池参考 (AWS 管理控制台)

为应用程序创建用户池的步骤

  1. 登录 Amazon Cognito 控制台

  2. 选择 Manage your User Pools

  3. 选择 Create a User Pool

  4. Pool name 中,键入池的名称,然后选择 Review defaults

  5. 在左侧导航栏中,选择 Apps,然后选择 Add an app。您可以为一个用户池创建多个应用程序客户端,还可以为每个平台创建一个应用程序。

  6. 对于 App name,键入应用程序的名称。将 Generate client secret 保持选定状态,选择 Create app,然后选择 Save changes

  7. 在左侧导航栏中,选择 Review,然后选择 Create pool

  8. 记下池 ID。您可以在左侧导航栏上的 Apps 下找到应用程序客户端 ID 和应用程序客户端密钥。

步骤 2:创建用户池对象

您必须为您的客户端应用程序创建一个 UserPool 对象。使用您在步骤 1 中获取的用户池 ID、应用程序客户端 ID 和应用程序客户端密钥创建一个 AWSCognitoIdentityUserPool

//setup service config AWSServiceConfiguration *serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:nil]; //create a pool AWSCognitoIdentityUserPoolConfiguration *configuration = [[AWSCognitoIdentityUserPoolConfiguration alloc] initWithClientId:@"CLIENT_ID" clientSecret:@"CLIENT_SECRET" poolId:@"USER_POOL_ID"]; [AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration userPoolConfiguration:configuration forKey:@"UserPool"]; AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:@"UserPool"];

步骤 3:为应用程序注册用户

要注册用户,您的应用程序的注册 UI 必须从用户处收集信息并调用 signUp

NSMutableArray * attributes = [NSMutableArray new]; //Set user attributes by retrieving them from your UI. These values are hardcoded for this example AWSCognitoIdentityUserAttributeType * phone = [AWSCognitoIdentityUserAttributeType new]; phone.name = @"phone_number"; //All phone numbers require +country code as a prefix phone.value = @"+15555555555"; AWSCognitoIdentityUserAttributeType * email = [AWSCognitoIdentityUserAttributeType new]; email.name = @"email"; email.value = @"email@mydomain.com"; [attributes addObject:phone]; [attributes addObject:email]; //set username and password by retrieving them from your UI. They are hardcoded in this example. AWSCognitoIdentityUser *user = [[pool signUp:@"username" password:@"password" userAttributes:attributes validationData:nil] continueWithSuccessBlock:^id _Nullable(AWSTask<AWSCognitoIdentityUser *> * _Nonnull task) { NSLog(@"Successfully registered user: %@",task.result.username); return nil; }];

步骤 4:为应用程序确认用户

当用户的电子邮件地址或电话号码通过验证后,他们就成为了已确认状态。在以下示例中,用户在注册流程中通过电子邮件地址或手机 SMS 接收验证代码,他们必须输入该代码才能完成注册。从您的最终用户处获取验证码后,调用 confirmSignUp

//replace VERIFICATION_CODE with the value the user inputs [[user confirmSignUp:@"VERIFICATION_CODE"] continueWithSuccessBlock:^id _Nullable(AWSTask<AWSCognitoIdentityProviderConfirmSignUpResponse *> * _Nonnull task) { NSLog(@"Successfully confirmed user: %@",user.username); return nil; }];

步骤 5:为应用程序验证用户身份

要对已确认的用户进行身份验证,请实施 AWSCognitoIdentityInteractiveAuthenticationDelegate 协议,如下所示,然后为池设置委派。此协议管理您的自定义登录 UI,并接受来自最终用户的用户名和密码信息。只有用户从未经过身份验证,或者用户已注销,或者用户的刷新令牌 (有效期为 30 天) 已过期时,才会调用该协议的方法。

//This code goes in your AppDelegate pool.delegate = self; -(id<AWSCognitoIdentityPasswordAuthentication>) startPasswordAuthentication{ //implement code to instantiate and display login UI here //return something that implements the AWSCognitoIdentityPasswordAuthentication protocol return loginUI; } //This code goes in your Login UI -(void) getPasswordAuthenticationDetails: (AWSCognitoIdentityPasswordAuthenticationInput *) authenticationInput passwordAuthenticationCompletionSource: (AWSTaskCompletionSource *) passwordAuthenticationCompletionSource { //using inputs from login UI create an AWSCognitoIdentityPasswordAuthenticationDetails object. //These values are hardcoded for this example. AWSCognitoIdentityPasswordAuthenticationDetails * result = [[AWSCognitoIdentityPasswordAuthenticationDetails alloc] initWithUsername:@"USERNAME" password:@"PASSWORD"]; //set the result to continue the sign-in process passwordAuthenticationDetails.result = result; }; -(void) didCompletePasswordAuthenticationStepWithError:(NSError*) error { dispatch_async(dispatch_get_main_queue(), ^{ //present error to end user if(error){ [[[UIAlertView alloc] initWithTitle:error.userInfo[@"__type"] message:error.userInfo[@"message"] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Ok", nil] show]; }else{ //dismiss view controller [self dismissViewControllerAnimated:YES completion:nil]; } }); }

步骤 6:获取用户详细信息

要获取用户详细信息,请调用 getDetails,如下所示。

[[user getDetails] continueWithSuccessBlock:^id _Nullable(AWSTask<AWSCognitoIdentityUserGetDetailsResponse *> * _Nonnull task) { AWSCognitoIdentityUserGetDetailsResponse *response = task.result; for (AWSCognitoIdentityUserAttributeType *attribute in response.userAttributes) { //print the user attributes NSLog(@"Attribute: %@ Value: %@", attribute.name, attribute.value); } return nil; }];

步骤 7:为应用程序用户获取访问 AWS 资源的凭证

要为用户获取访问 AWS 资源的凭证,请先将您的用户池与一个身份池关联,然后将 AWSCognitoIdentityUserPool 提供给 AWSCognitoCredentialsProvider。以下过程介绍了如何获取身份池。

创建身份池

  1. 登录 Amazon Cognito 控制台

  2. 选择 Manage Federated Identities

  3. 选择 Create new identity pool。在 Identity pool name 中,为身份池键入一个名称。

  4. 展开 Authentication providers 部分。

  5. 在“Cognito”选项卡上,指定您的 User Pool IDApp Client ID

  6. 在配置身份池关联后,通过将 AWSCognitoIdentityUserPool 提供给 AWSCognitoCredentialsProvider,获取访问应用程序的 AWS 凭证。

    AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"IDENTITY_POOL_ID" identityProviderManager:pool]; AWSServiceConfiguration *defaultServiceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = defaultServiceConfiguration;

后续步骤

如需演示本教程中所述功能的有效示例,请参阅 Github 上的 Objective-C 示例或者 Github 上的 Swift 示例