如何将 API 网关授权方上下文传递给 HTTP 集成



我已经成功地为我的 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 并等待一分钟!
它对我有用。

最新更新