0

我目前使用Cognito用户池作为API网关端点的授权者,直至Lambda函数。使用自定义属性通过API网关对Lambda进行身份验证Cognito用户是否安全?

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

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

LAMBDA处理程序:

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

if(isAdmin) etc... 

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

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

在用户登录到Cognito之后,我通过包含授权:JWToken标头,向Javascript API网关发送初始请求。

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

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

我非常希望能够限制访问基于用户游泳池内组API端点,不过我不认为这是可能的。

本文档介绍如何通过AWS Identity and Access Management限制访问权限。如果我沿着这条路走下去,我该如何向API网关发出请求?我仍然使用JWToken授权标题,并将Cognito用作API网关中的授权者吗?

+0

我现在知道使用自定义属性来确保endpoing绝对不安全:用户可以更新自己的属性。 – comfytoday

回答

0

Cognito用户池中包含的自定义属性/声明支持是安全的,可以在正确使用时用于此类用例。有几个警告。

首先,确保用户无法自己修改自定义属性。添加客户属性时,请勿将该属性标记为可变。而且,自定义属性可以被标记为对每个应用程序可读或可写。对于这种用例,您需要将该属性设置为用户可以访问的应用程序可读的。有关自定义属性的详细信息can be found here

另外需要注意的是,以确保您的请求主体永远无法绕过你的映射模板,可能允许攻击者的方式来直接设置属性被传递给你的lambda表达式的管理员。为此,请编辑您的集成请求并将“请求身体传递”设置为“从不”。

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

+0

感谢MikeD,我没有注意到可变选项。如果我要使用IAM组,我是否仍然以相同的方式对API网关进行身份验证? IE浏览器。标题中带有Cognito标记。 – comfytoday

相关问题