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

时间:2018-05-28 23:18:22

标签: amazon-web-services amazon-cognito

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

但是,我无法在Lambda函数中获得授权用户的身份。所有文档都让我相信它应该在上下文中,但它不是。我也无法在那里映射它。更重要的是,似乎也没有一种方法可以为给定ID标记的用户查询用户池。

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

2 个答案:

答案 0 :(得分:6)

这取决于您是否在Use Lambda Proxy Integration中为lambda选择了Integration Request。如果您已设置,则所有令牌的声明都将在event.requestContext.authorizer.claims上传递。

如果您不使用Lambda代理集成,则需要在Body Mapping Template中使用Integration Request作为lambda。具有application/json Content-Type的示例模板是:

"context" : {
    "sub" : "$context.authorizer.claims.sub",
    "username" : "$context.authorizer.claims['cognito:username']",
    "email" : "$context.authorizer.claims.email",
    "userId" : "$context.authorizer.claims['custom:userId']"
}

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

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

答案 1 :(得分:0)

使用event.requestContext.authorizer.claims.sub获取用户的Cognito身份sub,这基本上是他们的ID。 这假定您正在将代理集成与API Gateway和Lambda一起使用。

这是一个使用Node的简单示例;在其他SDK中应该相似。

exports.handler = async (event, context, callback) => {
    let cognitoIdentity = event.requestContext.authorizer.claims.sub

    // do something with `cognitoIdentity` here

    const response = {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Origin": "*"
        },        
        body: JSON.stringify("some data for user"),
    };
    return response;
};