当前位置: 首页 > 知识库问答 >
问题:

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

呼延烈
2023-03-14

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

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

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

共有2个答案

宰父浩漫
2023-03-14

使用事件。请求上下文。授权人。声称。sub获取用户的Cognito标识,该标识基本上是用户的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;
};
贺经纶
2023-03-14

这取决于您是否在lambda的集成请求中选择了使用Lambda代理集成。如果您设置了它,那么所有令牌的声明将在event.requestContext.authorizer.claims上传递。

如果未使用Lambda代理集成,则需要在集成请求中为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认知IDP API使用id令牌,需要使用访问令牌。但是,如果您的lambda被授权,您可以使用AdminGetUser调用用户名。

 类似资料:
  • 我正在使用AWS Congito用户池进行帐户管理,其中Cognoto标识池将此用户池作为标识提供者。我用它来控制通过API网关对API的访问,API网关向Lambda发送请求。我的Lambda是使用Micronaut用Java8实现的。所有这些都很好。 在Lambda中,我从中的获得名称: 在Cognito标识符的字符串名称中返回的是什么。像这样的东西: us-east-1:xxxxe650-5

  • 我正在使用AWS Amplify创建一个Lambda函数、RESTAPI和Cognito用户池。我想检索向endpoint发出请求的Cognito用户,以便访问他们的用户属性。 我为函数选择了无服务器Express模板: app.js 客户端配置根据当前用户的令牌设置授权头: 应用程序。js 事件()或上下文是否保存用户信息?或者我可以以某种方式使用授权标头吗? 另外,在Lambda函数中进行Co

  • 一旦用户登录到Cognito,我希望使用lambda函数获取与该用户关联的当前角色。 似乎Cognito用户池或身份池将用于移动应用程序,而前端开发人员? 正确的做法是什么?代码示例总是很好,但我更喜欢寻找逻辑解决方案或文档链接。 我尝试了亚马逊认知身份(这不是我要找的),并阅读了所有(?)留档这件事,但我不能在这里连接点...

  • 我正在使用AWS amplify创建一个应用程序,用户可以使用私有或公共文件访问级别上传图像,如文档中所述。除此之外,我还实现了一个lambda函数,该函数根据请求通过API网关修改图像并返回到修改图像的链接。 我想要的是,一个给定的用户应该能够调用API并只修改他自己的图像,而不能修改其他用户的图像;i、 e.允许AWS lambda函数使用来自cognito用户的执行角色。如果我允许lambd

  • 我正在尝试允许第三方应用程序(Google Home)访问AWS Cognito用户池中的信息。 整个流程如下(假设我理解正确): 用户试图将他们的设备(都在各种AWS服务中管理)链接到Google Home。 然后用户被重定向到我们的oauth2页面,在那里他们登录到cognito用户池中的帐户 他们成功登录并获得oauth令牌 Google Home应用程序可以使用该令牌向我们的后端发送请求,

  • 我正在尝试在iOS(Swift)应用程序中实现新的AWS Cognito用户池,但我很难让登录过程正常工作。我基本上是在尝试遵循这里提供的示例。 这是我到目前为止所拥有的: AppDelegate: LoginView控制器: 当我点击“登录”按钮时,似乎什么也没有发生,尽管如果我再次点击它,我会得到一个NSInternalInconsistencyException(我相信这是因为AWSTask