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

Mag*_*dal 9 lambda amazon-web-services node.js aws-api-gateway

我已经为我的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",
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的例子中,context包含一些参数,比如company_id,我想传递给我的Node端点.

如果我要使用Lambda端点,我知道这是通过Mapping Template完成的,如下所示:

{
  "company_id": "$context.authorizer.company_id"
}
Run Code Online (Sandbox Code Playgroud)

但是,如果选择Lambda作为Integration类型,则Body Mapping Template仅在Integration Request下可用.如果选择了HTTP则不行.

简而言之,我如何company_id从我的Lambda授权程序传递到我的Node API?

Mag*_*dal 16

在我的问题的评论中,大部分功劳都归功于@ 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
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

方法请求

在"方法请求/ HTTP请求标头"下,添加要转发的上下文属性:

  • 名称: company_id
  • 必填:可选
  • 兑现:可选

集成请求

在Integration Request/HTTP Headers下,添加:

  • 名称: company_id
  • 映射自: context.authorizer.company_id
  • 兑现:可选

  • 我认为这是 AWS 服务集成中一个强大的未记录(至少在帮助中没有列出)功能。 (2认同)

das*_*mug 8

如果您使用的是lamda-proxy,则可以从event.requestContext.authorizer.

因此company_id可以使用event.requestContext.authorizer.company_id.

  • 不要使用 lambda 代理,如果可能的话我想避免使用它。 (2认同)