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

问题描述 投票:0回答:6

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

非常感谢。

amazon-web-services aws-lambda aws-api-gateway
6个回答
16
投票

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

现在您可以从授权者函数返回这样的对象:

{
  "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
  }
}

不允许使用数组和对象,只有字符串/数字/布尔值作为有效的 JSON。根密钥必须命名为

context

您可以在请求 $context 中访问这些值,如下所示:

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

因此,要回答您的问题,您将无法有条件地 add 标头,但您可以将标头值设置为

$context.authorizer.yourKey
,如果授权者响应中未设置
yourKey
,则标头值将为空白(但标头仍会发送)。

编辑:

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


5
投票

经过一天的努力,我终于成功了,希望我能把别人从这样的困境中拯救出来。这为杰克斯的回应增添了更多内容。 基本上,您可以使用 Body Mapping Templates

动态添加标头
  1. 创建和授权者 Lambda(您可以使用授权者蓝图 Lambda 开始),执行业务逻辑来创建 AuthPolicy 并使用键/值填充 context 对象。
  2. 在 API 网关上,选择资源,单击 Method Request 并将 Auth 设置为您的 Authorizer lambda
  3. 打开方法执行,选择集成类型并确保取消选择使用 Lambda 代理集成(如果您的请求指向 lambda)
  4. 添加身体映射模板 - 从模板创建一个,您可以在此处访问 $context.authorizer.key
  5. 将以下内容添加到您的模板中(就在“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”的新标头,并转发所有原始标头,允许您将 user_id、user_role 等附加信息附加到上游服务。


3
投票

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

  1. 创建 lambda
  2. 方法请求下添加 lambda 作为您的授权者
  3. 打开集成请求
  4. 打开 HTTP 标头
  5. 添加带有您想要的名称的标题(上例中的
    key-header
  6. 使用
    context.authorizer.yourKey
    作为 映射自 条目。 (请注意,您不要在此字段中使用 $。)

1
投票

您只能从授权者结果中获取PrincipalId,在集成请求中,您可以使用

context.authorizer.principalId

映射标头值

0
投票

这些答案似乎特定于 HTTP API 网关。我们正在尝试使用可与两个 Lambda 一起使用的 RestAPI API 网关(将 pricnipalID 作为 Lambda Authorizer 转发的事件对象的一部分),而且我们还希望授权非 Lambda 端点(部署在私有 VPC 中并通过网络负载均衡器),因此我们希望将principalId放入端点将解析的HTTP标头中。


0
投票

Fima Furman,我尝试使用 Lambda 授权方的 RestAPI 端点解决方案,该授权方与私有 VPC 中部署的非 Lambda 端点进行通信。这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.