无服务器框架AWS细粒度访问控制

4
我正在尝试保护我的AWS API,使得DynamoDB行只能被相应已验证的Cognito用户访问,通过在我的Serverless Framework配置文件(serverless.yml)中实现细粒度访问控制。
请参考我正在尝试的示例,在AWS文档中查看。
我已经尝试将Cloudformation语法转换为Serverless,但没有成功。当我在策略声明中尝试像下面这样的表达式时:
Condition:
  ForAllValues:StringEquals:
    dynamodb:LeadingKeys: ["${cognito-identity.amazonaws.com:sub}"]

我遇到了一个错误:

变量cognito-identity.amazonaws.com:sub的变量引用语法无效。您只能引用环境变量、选项和文件。您可以查看我们的文档以获取更多信息。

在Serverless中这种操作是否可行?还是只有Cloudformation和SAM支持?

你能找到解决方案吗?我正在尝试做类似的事情。谢谢! - Fostah
你找到解决方案了吗? - systemdebt
@systemdebt 如果这是你仍然需要的内容,请检查我的答案。 - Volod
2个回答

2
我遇到了同样的问题,并且用以下方法解决了它:
Condition:
  ForAnyValue:StringLike:
    "dynamodb:LeadingKeys":
       - !Join ["", [ "$", "{cognito-identity.amazonaws.com:sub}" ]]

现在变量语法与AWS参数语法冲突,这并不是很干净的解决方式。详见此链接 - https://github.com/serverless/serverless/issues/2601


0

这在无服务器环境下是可能的。如果我是你,我会使用AWS Lambda来验证发送给用户的id_token。

在这种情况下,您应该首先使用Api Gateway或其他方法将密钥传输到AWS Lambda函数中。然后按照此指南验证令牌。代码可以在https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt中找到。

验证后,您可以在此处添加您的代码:

 ...... 
if claims['aud'] != app_client_id:
    print('Token was not issued for this audience')
    return False
# now we can use the claims

# add your code here #

print(claims)
return claims

1
谢谢,但这不是我想要实现的。我不需要验证JWT令牌 - 我的网关授权程序会自动为我执行此操作。我想要做的是使用Serverless框架在DynamoDb中实现细粒度访问控制。也就是说,让AWS自动确定经过身份验证的用户是否被允许访问DynamoDb中的特定文档。 - steddy_eddie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接