如何通过API网关将Cognito用户池信息传递给Lambda



我在API网关上有一个REST API,它使用Cognito用户池授权器,API调用Lambda函数。在Lambda函数中,我希望能够使用Cognito用户池信息(例如id令牌、用户id、电子邮件(,但我似乎无法实现。

从谷歌搜索来看,最好的方法似乎是使用身体映射模板来重新格式化上下文数据:

#set($inputRoot = $input.path('$'))
{
"user_id" : "$context.authorizer.claims.sub"
}

或者在集成设置Use Lambda Proxy Integration = True中设置,然后提取具有以下内容的用户数据:

def lambda_handler(event, context):
user_id = event.requestContext.authorizer.claims.sub

然而,这两种方法都不起作用。第一个给出了上下文中没有user_id的错误:

def lambda_handler(event, context):
user_id = context["user_id"] # <- fails

第二个只返回(我假设是(事件主体数据,没有requestContext属性。

我的集成类型设置为Lambda。我有什么东西不见了吗?

因此,对于其他处于类似情况的人,我最终只是删除了API并重新制作它,然后它适用于这两种情况。我猜,就像AWS的大多数东西一样,你最好删除并重新开始,而不是在设置完成后尝试更改设置。

您可以通过以下方式访问Cognito声明:

claims = event['requestContext']['authorizer']['claims'] # that's a dict

这包含您要查找的内容。

顺便说一句,Lambda事件的结构有时有些复杂。我正在开发awsmate,这是一个Python库,旨在使它们更易于使用,除其他外:https://awsmate.readthedocs.io/

在您的情况下,代码看起来像:

from awsmate.apigateway import LambdaProxyEvent
def lambda_handler(event, context):
apigateway_event = LambdaProxyEvent(event)
claims = apigateway_event.authorizer_claims() # No need to look for where it is in the raw event

相关内容

  • 没有找到相关文章

最新更新