2

我使用以下 AWS 技术构建无服务器应用程序:

  • AWS 认知
  • AWS 拉姆达
  • AWS API 网关
  • AWS IAM

来自客户端的所有请求(在 Angular2 中编程)都通过 API 网关。

我为登录用户创建了一个 IAM 角色:Cognito_MyApp_Auth。我使用 aCognito User Pool Authorizer来确保对我的 API 的所有调用都来自有效的登录用户。

问题:如何授予 Lambda 函数与登录用户相同的权限?

用例:登录用户只能在他自己的 S3 存储桶中创建、编辑或删除,因此授予 Lambda 对 S3 的完全权限不是一种选择。

4

2 回答 2

1

Cognito_MyApp_Auth不为用户设置不同的权限。它只定义任何签名用户的权限。因此,您应该允许访问此角色策略中的所有存储桶。(但是,我会将此访问权限限制为以特定前缀开头的存储桶。)

幸运的是,当通过 Cognito SDK 调用 Lambda 时,使用 Cognito 提供的凭证,传递给处理程序的上下文对象携带用于调用 Lambda 的 Cognito 身份。

对于 Node.js,您可以查看如何获取此信息:

http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html#nodejs-prog-model-context-example

if (typeof context.identity !== 'undefined') {
    console.log('Cognito
    identity ID =', context.identity.cognitoIdentityId);
}    

获得身份 ID 后,您可以设置自己的逻辑来限制用户对自己的存储桶的访问。

当您使用 Cognito SDK 直接从应用程序调用 Lambda 时就是这种情况。如果您使用 API Gateway,AWS 员工有一篇很好的帖子:https ://forums.aws.amazon.com/thread.jspa?messageID=717379

于 2017-03-06T20:56:23.700 回答
0

无法直接授予 Lambda 函数与登录用户相同的权限;但是,您应该能够使用 Cognito 身份池和使用 cognito-identity 上下文变量的策略来实现您的用例。

对于这种方法,您不会使用 Cognito 用户池或 Cognito 用户池授权方。相反,您将 Cognito 身份池用于联合身份。将 API 方法的授权设置为 AWS_IAM。不要使用 Lambda 作为集成,而是使用 AWS 代理直接集成到 S3。将集成请求设置为使用调用者的身份。

要调用 API,您需要使用 Cognito 获取临时凭证,然后使用它们签署您的 API 请求。

使用这种方法,S3 调用是使用 Cognito 身份上下文进行的,因此您可以将使用 cognito-identity 变量的策略附加到与 Cognito 身份池中经过身份验证的用户关联的 IAM 角色。

例如:

{
  "Effect": "Allow",
  "Action": [
    "s3:PutObject"
  ]
  "Resource": [
    "arn:aws:s3:::BUCKET_FOR_USER_${cognito-identity.amazonaws.com:sub}/*"
  ]
}

有关类似用例,请参阅此帖子。

于 2017-03-07T19:39:49.220 回答