在Lambda函数中获取Cognito用户池标识

Mar*_*bst 3 amazon-web-services amazon-cognito

我有一个Lambda函数处理由API网关触发的POST请求.后者设置为通过Cognito用户池授权程序进行授权.授权工作 - 如果我传递用户的ID令牌,则处理请求,如果我不能获得401.

但是,我无法在Lambda函数中获得授权用户的身份.所有文档都让我相信它应该在上下文中,但事实并非如此.我也无法在那里映射它.更重要的是,似乎没有办法为给定ID标记的用户查询用户池.

我需要一个身份池才能完成此任务吗?如果是这样,那怎么办?为什么API网关不会自动传递用户的身份?

Rav*_*car 10

这取决于你是否Use Lambda Proxy Integration选择Integration Request了lambda.如果你设置了它,那么所有令牌的声明都将被传递event.requestContext.authorizer.claims.

如果不使用lambda代理集成,那么你需要使用Body Mapping TemplateIntegration Request为拉姆达.application/jsonContent-Type 的示例模​​板是:

"context" : {
    "sub" : "$context.authorizer.claims.sub",
    "username" : "$context.authorizer.claims['cognito:username']",
    "email" : "$context.authorizer.claims.email",
    "userId" : "$context.authorizer.claims['custom:userId']"
}
Run Code Online (Sandbox Code Playgroud)

这期望用户池中有一个名为userId的自定义属性,当然它们可由客户端读取.

您不能对aws cognito-idp API使用id令牌,您需要使用访问令牌.但是,如果您的lambda已获得授权,则可以使用带有用户名的AdminGetUser调用.