我已经成功地为我的 AWS API 网关实施了 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
,我想传递给我的 Node 端点。
如果我要使用 Lambda 终端节点,我知道这是通过映射模板和类似的东西完成的:
{
"company_id": "$context.authorizer.company_id"
}
但是,如果选择集成类型,则正文映射模板仅在集成请求下可用。如果选择了 HTTP,则不会。
简而言之,如何将company_id
从我的 Lambda 授权方传递到我的节点 API?
在我的问题的评论中,大部分功劳都归功于 @Michael-sqlbot,但如果其他人发现这个问题,我会把完整的答案放在这里。
授权方 Lambda
它必须以这种格式返回一个对象,其中上下文包含要转发到终结点的参数,如问题中指定的那样。
{
"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", <-- The part you want to forward
...
}
}
方法请求
在"方法请求/HTTP 请求标头"下,添加要转发的上下文属性:
- 姓名:
company_id
- 必需:可选
- 兑现:可选
集成请求
在集成请求/HTTP 标头下,添加:
- 姓名:
company_id
- 映射自:
context.authorizer.company_id
- 兑现:可选
如果您使用的是lamda-proxy
,则可以从event.requestContext.authorizer
访问上下文。
因此,您可以使用event.requestContext.authorizer.company_id
访问您的company_id
。
如果您使用的是lamda-proxy
(至少在 Golang 后端(,您可以访问存储在授权方上下文中的值,而无需映射模板使用! 请记住重新启动 API 并等待一分钟!
它对我有用。