使用以下AWS技术构建无服务器应用程序:
来自客户端的所有请求(在Angular2中编程)都通过API网关。
我为已登录的用户创建了一个IAM角色:Cognito_MyApp_Auth
。
我使用Cognito User Pool Authorizer
来确保对我的API的所有调用都来自有效的登录用户。
问题:如何授予Lambda函数与登录用户相同的权限?
使用案例:已登录的用户只能在自己的S3存储桶中创建,编辑或删除,因此无法向S3授予Lambda完全权限。
答案 0 :(得分:1)
Cognito_MyApp_Auth
未设置用户与用户的不同权限。它仅定义任何签名用户的权限。因此,您应该允许访问此角色策略中的所有存储桶。 (但是,我将这种访问限制为以特定前缀开头的存储区。)
幸运的是,当通过Cognito SDK调用Lambda时,使用Cognito提供的凭据,传递给处理程序的上下文对象带有用于调用Lambda的Cognito身份。
对于Node.js,您可以看到如何获取此信息:
if (typeof context.identity !== 'undefined') {
console.log('Cognito
identity ID =', context.identity.cognitoIdentityId);
}
获得身份ID后,您可以设置自己的逻辑来限制用户访问自己的存储桶。
使用Cognito SDK直接从应用程序调用Lambda时就是这种情况。如果您使用API网关,那么AWS员工会发布一篇好文章:https://forums.aws.amazon.com/thread.jspa?messageID=717379
答案 1 :(得分:0)
没有直接的方法来授予Lambda函数与登录用户相同的权限;但是,您应该能够使用Cognito-identity上下文变量使用Cognito身份池和策略来实现您的用例。
对于此方法,您不会使用Cognito用户池,也不会使用Cognito用户池授权程序。而是使用Cognito身份池进行联合身份识别。将您的API方法的授权设置为AWS_IAM。不要将Lambda用作集成,而是使用AWS代理直接集成到S3。设置集成请求以使用呼叫者的身份。
要对API进行调整,您需要使用Cognito获取临时凭据,然后与他们签署API请求。
使用此方法,S3调用是使用Cognito身份上下文进行的,因此您可以将使用认知身份变量的策略附加到与Cognito身份池中经过身份验证的用户关联的IAM角色。
例如:
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
]
"Resource": [
"arn:aws:s3:::BUCKET_FOR_USER_${cognito-identity.amazonaws.com:sub}/*"
]
}
有关类似的用例,请参阅this post。