0

我在我的ApiGateway中使用Lambda代理和Cognito用户池授权器。在Lambda函数中,我可以通过事件对象访问路径等变量。除此之外,我想访问经过身份验证的用户的声明。在文件上写着,我应该使用:AWS ApiGateway Lambda代理访问授权者

context.authorizer.claims.property

但我授权为空,所以我得到

Cannot read property 'claims' of undefined

任何人只要有一个想法?

回答

1

如果您指的是this part of the documentation,$context.authorizer.claims是集成映射模板的一部分。它与处理程序的参数context无关。使用Lambda Proxy integration,您正在使用passthrough mapping template。 (请参阅编辑)。请参见编辑。您可能会需要禁用Lambda Proxy integration和使用类似这样的映射模板:

{ 
    "identity" : { 
     "sub" : "$context.authorizer.claims.sub", 
     "email" : "$context.authorizer.claims.email" 
    } 
} 

映射模板“打造”拉姆达的event参数。因此,您可以通过参数event访问您的索赔部分。

exports.handler = (event, context, callback) => { 
    // TODO implement 
    callback(null, event.identity.email); 
}; 

注意,我稍微修改了文档和示例,以避免什么context可以是另一个困惑:

  • 在API网关
  • 处理程序的第二个参数映射模板变量在Lambda
  • event参数的一个关键在文档的某些示例中< =我给它改名identity

编辑

正如doorstuckthe information is available using the proxy integration

+0

感谢您的详细解答。当我禁用代理集成时,我将无法访问像路径,查询字符串等属性? – SnowMax

+0

您也可以通过映射模板来完成。我会建议选择“Method Requet passthrough”模板并用你需要的模板来完成它。 –

+0

作品!谢谢;) – SnowMax

2

接受的答案会工作,但它并不需要指出。当使用lambda代理集成您可以访问授权的权利要求:

event.requestContext.authorizer.claims 

你可以尝试console.log(event);,看看你得到了一个lambda代理整合CloudWatch的日志信息。

+0

不错,当* not *使用Lambda代理集成时,“Method Requet passthrough”不包含它。我认为会使用相同的映射模板。 –

相关问题