当我在AWS API网关API中创建资源/方法时,我可以创建以下方法之一:DELETE
、GET
、HEAD
、OPTIONS
、PATCH
或POST
。
如果我选择GET
,那么API网关不会通过身份验证详细信息;但对于CCD_ 8来说确实如此。
对于GET
,我应该将cognito凭据添加到我的GET
的URL中吗?还是永远不使用GET
,对所有经过身份验证的呼叫使用POST
?
我在API网关/Lambda中的设置:
我创建了一个Resource和两个方法:GET
和POST
在"授权设置"下,我将"授权"设置为AWS_AIM
对于本例,没有Request Model
在方法执行下,我将集成类型设置为Lambda函数,并检查Invoke with caller credentials
(我还设置了Lambda区域和Lambda函数)我未选中Credentials cache
。
对于Body Mapping Templates,我将Content-Type
设置为"application/json",将Mapping Template设置为
{ "identity" : "$input.params('identity')"}
在我的Python Lambda函数中:
def lambda_handler(event, context):
print context.identity
print context.identity.cognito_identity_id
return True
运行Python函数:
对于GET
上下文,identity为None对于POST
上下文,identity有一个值,而context.identity.cognito_identity_id
有正确的值。
如注释中所述:所有HTTP方法都支持身份验证。如果该方法配置为需要身份验证,则身份验证结果应包含在上下文中,以便您通过映射模板进行访问,以作为上下文信息向下传递。
如果这对你不起作用,请更新你的问题以反映:
- 如何配置API方法
- 您的映射模板是什么
- 你在测试中看到了什么结果
更新
lambda函数中的代码检查的是lambda函数的上下文,而不是API网关中的值。要访问从API网关传入的值,需要使用event.identity
而不是context.identity
。
这只能解决一半的问题,因为您没有使用正确的值来访问API网关中的标识。这将是$context.identity.cognitoIdentityId
(假设您使用的是Amazon Cognito auth)。有关支持变量的完整指南,请参阅映射模板参考。
最后,您可能需要考虑使用本问题中引用的模板。