我在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