是否可以从 API 网关上的 AWS Custom Auth 添加 HTTP header?

Is it possible to add an HTTP header from AWS Custom Auth on API gateway?

我在 AWS API 网关上使用自定义身份验证,但我想根据结果添加额外的 HTTP header。有谁知道这是否可能,或者如何去做。如果不是,是否知道这是否或何时可能?

非常感谢。

您只能从授权方结果中获取 PrincipalId,在您的集成请求中,您可以使用 context.authorizer.principalId

映射一个 header 值

我们最近添加了对此的支持。文档应该很快就会出现。

现在您可以从授权函数 return object 像这样:

{
  "principalId": "xxxxxxxx", // The principal user identification associated with the token send by the client.
  "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" : {
    "key" : "value",
    "numKey" : 1,
    "boolKey" : true
  }
}

数组和 object 是不允许的,只有 string/number/boolean 是有效的 JSON。根密钥必须命名为 context

您可以像这样在请求 $context 中访问这些值:

$context.authorizer.key -> value 
$context.authorizer.numKey -> 1
$context.authorizer.boolKey -> true

所以要回答你的问题,你不能有条件地添加 header,但你可以设置header 值设置为 $context.authorizer.yourKey,如果授权方响应中未设置 yourKey,则 header 值将为空(但 header 仍为发送)。

编辑:

文档已上线 http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html

在拔掉我的头发一天后,我能够让这个工作正常进行,希望我能从中拯救一些人。它为 Jacks 的回应增加了一点。 基本上,您可以使用 Body 映射模板

动态添加 headers
  1. 创建和授权 Lambda(您可以使用授权蓝图 lambda 开始),执行您的业务逻辑以创建 AuthPolicy 并填充 context object key/values.
  2. 在 API 网关上,select 资源,单击 方法请求 并将 Auth 设置为您的 Authorizer lambda
  3. 打开 Method Execution,select Integration 类型并确保 unselect Use Lambda Proxy集成(如果您的请求指向 lambda)
  4. 添加 Body 映射模板 - 从模板创建一个,这是您可以访问 $context.authorizer.key
  5. 的地方
  6. 将以下内容添加到您的模板中(就在 "body-json" 下方:$input.json('$')," 可以)
"headers": {
     "key-header" : "$util.escapeJavaScript($context.authorizer.key)",
     #foreach($param in $input.params().header.keySet())
         "$param": "$util.escapeJavaScript($input.params().header.get($param))" 
         #if($foreach.hasNext),#end
     #end },

这将添加一个名为 "key-header" 的新 header 并转发所有原始 header,允许您附加其他信息,例如 user_id、user_role, 等到上游服务.

我试过 Emanuel Canha 上面的回答,但似乎不再有效。我昨天(2019 年 6 月 5 日)让它工作的方法是

  1. 创建 lambda
  2. 方法请求下添加lambda作为你的授权者
  3. 打开集成请求
  4. 打开 HTTP Headers
  5. 添加一个header你想要的名字(上面例子中的key-header
  6. 使用 context.authorizer.yourKey 作为从 条目映射的 。 (注意你do not use the $ in this field。)