【发布时间】:2018-01-19 18:26:14
【问题描述】:
我已成功为我的 AWS API Gateway 实施了 Lambda 授权方,但我想将一些自定义属性从它传递到我的 Node.js 端点。
我的授权人的输出遵循 AWS 指定的格式,如下所示。
{
"principalId": "yyyyyyyy",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow|Deny",
"Resource": "arn:aws:execute-api:<regionId>:<accountId>:<appId>/<stage>/<httpVerb>/[<resource>/<httpVerb>/[...]]"
}
]
},
"context": {
"company_id": "123",
...
}
}
在我的例子中,context 包含一些参数,例如 company_id,我想将它们传递给我的节点端点。
如果我要使用 Lambda 端点,我知道这是通过映射模板和类似的东西完成的:
{
"company_id": "$context.authorizer.company_id"
}
但是,如果选择 Lambda 作为集成类型,则正文映射模板仅在集成请求下可用。如果选择了 HTTP,则不会。
简而言之,我如何将company_id 从我的 Lambda 授权方传递到我的 Node API?
【问题讨论】:
-
如何将这些值放入 HTTP 请求标头中?
-
@Michael-sqlbot 这正是我想做的。标题、网址或正文并不重要。什么都会好的。问题是如何做到这一点?
-
在集成请求中创建一个标头,然后指定,例如
context.identity.whatever没有$开头。我没有使用自定义授权器,但这对我访问上下文对象中的其他内容并将它们放入转发到源的标头中很有用...例如,我尝试了context.stage和context.apiId,它们都按预期转发,作为 HTTP 标头。试试看? -
此外,“使用 HTTP 代理集成”选项的命名似乎很糟糕。如果您想使用请求正文映射模板...只需取消选中该选项。看起来这个选项实际上意味着“你知道吗?别挡我的路,代理请求,不管它是什么,这样我就可以避免弄乱身体映射模板。”无论是否选中该选项,您都可以将请求代理到后端。
-
@Michael-sqlbot 谢谢迈克尔!终于在您的回答和aws支持的帮助下让它工作了。我需要将
context.authorizer.company_id设置为集成请求下的 HTTP 标头和company_id设置为方法执行下的 HTTP 请求标头。
标签: node.js amazon-web-services lambda aws-api-gateway