Cognito、API Gateway 和 Lambda 假设 Cognito 用户的身份

Nic*_*ick 8 aws-lambda serverless

我正在构建一个 React 应用程序,使用 API Gateway、lambda 和 cognito(基本上从https://serverless-stack.com教程开始)。我想为我的 DynamoDb 设置细粒度的访问控制(即通过基于登录用户限制对 DynamoDb 表的访问的 IAM 策略 - 如https://docs.aws.amazon.com/IAM/latest/UserGuide/ reference_policies_examples_dynamodb_rows.html )

AFAIK,一个 lambda 函数承担一个服务角色,如 serverless.yml 文件中定义的那样,它本身与附加到登录的 cognito 用户的 AIM 策略无关。我知道使用aim_authorizer,我可以获得登录用户的信息。

我的问题:是否可以让 lambda 代表给定的认知用户执行 AWS 调用,从而遵守附加到该用户的 IAM 策略?(有点类似于 serverless-stack 教程如何与 S3 交互)

欢迎所有建议。

Jen*_* Y. 0

您可以向任何 AWS 客户端库显式指定使用哪些凭证来签署请求(默认情况下,它们取自运行时环境):

import { DocumentClient } from 'aws-sdk/clients/dynamodb';

const client = new DocumentClient({
    credentials: ...
});

Run Code Online (Sandbox Code Playgroud)

这些安全凭证是通过 STS 获取的。如何获取用户身份以获取凭据的情况有多种,但通常您会选择(assumeRole如果您有角色),或者(assumeRoleWithWebIdentity如果有实际用户执行了 OpenID Connect 流程):

import { Credentials, STS } from 'aws-sdk';

const sts = new STS();
const stsResponse = await sts.assumeRole({ RoleArn: 'can-be-cognito-group-arn' }).promise();
// or
// const stsResponse = await sts.assumeRoleWithWebIdentity({ WebIdentityToken: 'open-id-token' }).promise();

const credentials = new Credentials(
    response.Credentials.AccessKeyId,
    response.Credentials.SecretAccessKey,
    response.Credentials.SessionToken);
Run Code Online (Sandbox Code Playgroud)