当我在AWS API Gateway API中创建资源/方法时,我可以创建以下方法之一:DELETE
,GET
,HEAD
,OPTIONS
,{{ 1}}或PATCH
。
如果我选择POST
,则API网关不会传递身份验证详细信息;但对于GET
它确实如此。
对于POST
,我应该将Cognito凭据添加到GET
的网址吗?或者永远不要使用GET
并使用GET
进行所有经过身份验证的来电?
我在API网关/ Lambda中的设置:
我创建了一个资源和两个方法:POST
和GET
在授权设置下,我将授权设置为POST
对于此示例,没有AWS_AIM
在方法执行下我将集成类型设置为Lambda函数,然后检查Request Model
(我还设置了Lambda Region和Lambda函数)
我未选中Invoke with caller credentials
。
对于Body Mapping模板,我将Credentials cache
设置为`application / json',将映射模板设置为
Content-Type
在我的Python Lambda函数中:
{ "identity" : "$input.params('identity')"}
运行Python函数:
对于def lambda_handler(event, context):
print context.identity
print context.identity.cognito_identity_id
return True
context.identity为None
对于GET
context.identity有一个值,POST
具有正确的值。
答案 0 :(得分:2)
如评论中所述:所有HTTP方法都支持身份验证。如果该方法配置为要求身份验证,则应包含在上下文中,以便您通过映射模板进行访问,以将下游作为上下文信息传递。
如果这不适合您,请更新您的问题以反映:
<强>更新强>
lambda函数中的代码检查 Lambda 函数的上下文,而不是API Gateway的值。要访问从API网关传入的值,您需要使用event.identity
而不是context.identity
。
这只能解决您的问题,因为您没有使用正确的值来访问API网关中的标识。这将是$context.identity.cognitoIdentityId
(假设您使用的是Amazon Cognito身份验证)。有关支持的变量的完整指南,请参阅mapping template reference。
最后,您可能需要考虑使用引用in this question的模板。