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

biswetbf  于 2022-12-18  发布在  Node.js
关注(0)|答案(3)|浏览(130)

我已经成功地为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,我希望将这些参数传递给我的Node端点。
如果我使用Lambda端点,我知道这是通过Map模板和类似下面的内容完成的:

{
  "company_id": "$context.authorizer.company_id"
}

但是,仅当选择Lambda作为集成类型时,主体Map模板才在集成请求下可用。如果选择HTTP,则不可用。
简而言之,如何将company_id从Lambda授权程序传递到Node API?

y53ybaqx

y53ybaqx1#

大部分功劳都要归功于我的问题的评论中的@Michael-sqlbot,但是如果其他人找到这个问题,我会把完整的答案放在这里。

授权人Lambda

它必须以这种格式返回一个对象,其中context包含要转发到端点的参数,如问题中所指定的。

{
  "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
  • Map自:context.authorizer.company_id
  • 兑现:* 可选 *
xoefb8l8

xoefb8l82#

如果您使用的是lamda-proxy,则可以从event.requestContext.authorizer访问上下文。
因此,可以使用event.requestContext.authorizer.company_id访问您的company_id

m2xkgtsf

m2xkgtsf3#

如果你正在使用lamda-proxy(至少在Golang后端),你可以访问存储在授权者上下文中的值,而无需Map模板的使用!记住重新启动API并等待几分钟!
对我很有效。

相关问题