在登录后使用身份池访问 AWS 服务 - Amazon Cognito

在登录后使用身份池访问 AWS 服务

用户通过用户池登录后,他们可以使用从身份池发放的临时 API 凭证访问 AWS 服务。

您的 Web 应用程序或移动应用程序接收来自用户池的令牌。当您将用户池配置为身份池的身份提供者时,身份池会将令牌交换为临时 AWS 凭证。这些凭证的范围可以限定为 IAM 角色及其策略,这些策略授予用户访问一组有限的 AWS 资源。有关更多信息,请参阅 身份池身份验证流程

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

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

您可以使用身份池凭证来完成以下操作:

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

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

  • 连接到使用 IAM 授权连接的数据库后端,例如 Amazon DynamoDB 或 Amazon RDS。

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

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

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

有关结合使用身份池和用户池组来控制 AWS 资源访问权限的更多信息,请参阅 向用户池添加组使用基于角色的访问控制。有关身份池和 AWS Identity and Access Management 的更多信息,另请参阅身份池身份验证流程

使用 AWS Management Console 设置用户池

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

使用 AWS Management Console 设置身份池

以下过程介绍了如何使用 AWS 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>

您可以根据用户池 ID 推导出 <region> 的值。例如,如果用户池 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)