代码之家  ›  专栏  ›  技术社区  ›  Mark Probst

获取lambda函数中的cognito用户池标识

  •  3
  • Mark Probst  · 技术社区  · 7 年前

    我有一个lambda函数来处理由API网关触发的POST请求。后者设置为通过认知用户池授权器进行授权。授权有效-如果我传递了一个用户的ID令牌,请求就会被处理,如果我没有,我会得到401。

    但是,我无法在lambda函数中获取授权用户的标识。所有的文档都让我相信它应该在上下文中,但事实并非如此。我也无法将其映射到上下文中。此外,似乎也没有一种方法可以查询给定ID令牌的用户的用户池。

    我需要一个身份池来完成这个任务吗?如果是的话,这是怎么工作的?为什么API网关不能自动传递用户的身份呢?

    2 回复  |  直到 7 年前
        1
  •  9
  •   Mark Probst    7 年前

    这要看你有没有 Use Lambda Proxy Integration 在中选择 Integration Request event.requestContext.authorizer.claims

    如果不使用lambda代理集成,则需要使用 Body Mapping Template 集成请求 对于lambda。示例模板 application/json 内容类型为:

    "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调用与用户名一起使用。

        2
  •  0
  •   openwonk    6 年前

    使用 event.requestContext.authorizer.claims.sub 获取用户的认知身份 sub ,基本上是他们的ID。 这假设您正在使用与API网关和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;
    };