0

我目前正在使用 Cognito 用户池作为 API 网关端点的授权方,一直到 Lambda 函数。

我可以将集成请求传递给 Lambda 并根据自定义属性从 Lambda 内部安全地允许或拒绝吗?

映射:“管理员”:“$context.authorizer.claims['custom:administrator']”,

Lambda 处理程序:

boolean isAdmin =   Boolean.parseBoolean(request.getContext().get("administrator"));

if(isAdmin) etc...

需要明确的是,不是管理员的用户不应访问与管理员相同的 API 端点。

在此之前/之后我还需要做其他事情吗?

在用户登录 Cognito 后,我通过包含 Authorization: JWToken 标头,使用 Javascript 向 API Gateway 发送初始请求。

我需要在 Lambda 函数中验证令牌的签名吗?我认为 API Gateway 已经做到了。

在安全性方面有没有更好的方法来管理这个?

理想情况下,我希望能够根据用户池中的 GROUPS 限制对 API 端点的访问,但我认为这是不可能的。

Groups 文档讨论了通过 AWS Identity and Access Management 限制访问/权限。如果我沿着这条路走,我如何向 API Gateway 发出请求?我是否仍然使用 JWToken 授权标头,并使用 Cognito 作为 API 网关中的授权者?

4

1 回答 1

1

Cognito 用户池中包含的自定义属性/声明支持是安全的,并且在正确使用时可用于此类用例。有几点需要注意。

首先,确保用户不能自己修改自定义属性。添加客户属性时,不要将属性标记为可变。此外,可以将自定义属性标记为每个应用程序的可读或可写。对于这个用例,您需要将属性设置为用户有权访问的应用程序可读。可以在此处找到有关自定义属性的详细信息。

另一个警告是确保您的请求正文永远不会绕过您的映射模板,这可能允许攻击者直接设置传递给您的 Lambda 函数的管理员属性。为此,请编辑您的集成请求并将“请求正文传递”设置为“从不”。

对于此用例,您还可以使用其他替代方案。最简洁的方法是为您的管理员提供完全独立的 API。然后,您可以为管理员使用单独的 Cognito 用户池,也可以使用 IAM 用户或组。

于 2017-03-08T03:06:17.463 回答