登录后 Amazon Web Services 使用身份池进行访问 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

登录后 Amazon Web Services 使用身份池进行访问

用户使用用户池登录后,他们可以使用身份池颁发的临时 API 凭证进行访问 Amazon Web Services 。

您的网络或移动应用程序接收来自用户池的令牌。当您将用户池配置为身份池的身份提供者时,身份池会用令牌交换临时 Amazon 证书。这些证书的范围可以限于 IAM 角色及其策略,这些策略允许用户访问有限的 Amazon 资源。有关更多信息,请参阅 身份池(联合身份)身份验证流程

下图显示了应用程序如何使用用户池登录、检索身份池凭证以及如何从中请求资产。 Amazon Web Service

使用 Amazon Cognito 用户池进行身份验证并使用身份池授权 Amazon 访问资源的应用程序流程图。

您可以使用身份池凭证来:

  • 使用您的用户自己的凭证向 Amazon Verified Permissions 提出精细的授权请求。

  • 连接到 Amazon API Gateway REST API 或授权与 IAM 连接的 Amazon AppSync GraphQL API。

  • 连接到授权与 IAM 连接的数据库后端,例如亚马逊 DynamoDB 或 Amazon RDS。

  • 从 Amazon S3 存储桶中检索应用程序资产。

  • 使用 Amazon WorkSpaces 虚拟桌面启动会话。

身份池不只在经过身份验证的用户池会话中运行。他们还直接接受来自第三方身份提供商的身份验证,并且可以为未经身份验证的访客用户生成凭证。

有关使用身份池和用户池组来控制对 Amazon 资源的访问的更多信息,请参阅向用户池添加组使用基于角色的访问控制。另外,有关身份池和的更多信息 Amazon Identity and Access Management,请参阅身份池概念

使用设置用户池 Amazon Web Services Management Console

创建 Amazon Cognito 用户池并记下每个客户端应用程序的用户池 ID应用程序客户端 ID。有关创建用户池的更多信息,请参阅用户池入门

使用设置身份池 Amazon Web Services Management Console

以下过程介绍如何使用将 Amazon Web Services Management Console 身份池与一个或多个用户池和客户端应用程序集成。

添加 Amazon Cognito 用户群体身份提供者 (IdP)
  1. Amazon Cognito 控制台中选择身份池。选择身份池。

  2. 选择用户访问选项卡。

  3. 选择添加身份提供者

  4. 选择 Amazon Cognito 用户群体

  5. 输入用户群体 ID应用程序客户端 ID

  6. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置

    1. 您可以为来自该 IdP 的用户提供您在配置身份验证角色时设置的默认角色,也可以使用规则选择角色。使用 Amazon Cognito 用户群体 IdP,还可以选择令牌中包含 preferred_role 声明的角色。有关 cognito:preferred_role 声明的更多信息,请参阅将优先级值分配到组

      1. 如果您选择 “选择带规则的角色”,请输入来自用户身份验证的来源声明、用于将声明与规则进行比较的运算符、将导致与该角色选择匹配的,以及角色分配匹配时要分配的角色选择添加其他,以根据不同的条件创建其他规则。

      2. 如果您在令牌中选择带有 preferred_role 声明的角色,Amazon Cognito 会为您的用户声明中的角色颁发证书。cognito:preferred_role如果不存在首选角色声明,Amazon Cognito 将根据您的角色解析发放凭证。

    2. 选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。

  7. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性

    • 如果不应用主体标签,请选择非活动

    • 要基于 subaud 声明应用主体标签,请选择使用原定设置映射

    • 要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键

  8. 选择保存更改

将用户池与身份池集成

对您的应用程序用户进行身份验证后,将用户的身份令牌添加到凭证提供程序中的登录映射中。提供商名称取决于 Amazon Cognito 用户池 ID。结构如下所示:

cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>

您可以<region>从用户池 ID 中推导出值。例如,如果用户池 ID 为us-east-1_EXAMPLE1,则<region>为us-east-1。如果用户池 ID 为us-west-2_EXAMPLE2,则<region>为us-west-2

JavaScript
var cognitoUser = userPool.getCurrentUser(); if (cognitoUser != null) { cognitoUser.getSession(function(err, result) { if (result) { console.log('You are now logged in.'); // Add the User's Id Token to the Cognito credentials login map. AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'YOUR_IDENTITY_POOL_ID', Logins: { 'cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>': result.getIdToken().getJwtToken() } }); } }); }
Android
cognitoUser.getSessionInBackground(new AuthenticationHandler() { @Override public void onSuccess(CognitoUserSession session) { String idToken = session.getIdToken().getJWTToken(); Map<String, String> logins = new HashMap<String, String>(); logins.put("cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>", session.getIdToken().getJWTToken()); credentialsProvider.setLogins(logins); } });
iOS - objective-C
AWSServiceConfiguration *serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:nil]; AWSCognitoIdentityUserPoolConfiguration *userPoolConfiguration = [[AWSCognitoIdentityUserPoolConfiguration alloc] initWithClientId:@"YOUR_CLIENT_ID" clientSecret:@"YOUR_CLIENT_SECRET" poolId:@"YOUR_USER_POOL_ID"]; [AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration userPoolConfiguration:userPoolConfiguration forKey:@"UserPool"]; AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:@"UserPool"]; AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"YOUR_IDENTITY_POOL_ID" identityProviderManager:pool];
iOS - swift
let serviceConfiguration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: nil) let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET", poolId: "YOUR_USER_POOL_ID") AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: "UserPool") let pool = AWSCognitoIdentityUserPool(forKey: "UserPool") let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "YOUR_IDENTITY_POOL_ID", identityProviderManager:pool)