是否可以在API网关上添加来自AWS自定义认证的HTTP标头?



我在AWS API网关上使用自定义认证,但我想根据结果添加额外的HTTP标头。有人知道这是否可能,或者怎么做吗?如果不是,是否知道这是否或何时可能实现?

许多谢谢。

我们最近添加了对此的支持。医生应该很快就来了。

现在可以从authorizer函数返回如下对象:

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

你可以像这样在request $context中访问这些值:

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

所以要回答你的问题,你不能有条件地添加报头,但你可以设置报头值为$context.authorizer.yourKey,如果yourKey没有在授权者响应中设置,报头值将是空白的(但报头仍然会被发送)。

编辑:

Docs是活的http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html

我花了一天的时间才把它弄出来,希望我能拯救一些人。这给杰克的反应增加了一点分量。基本上,您可以通过使用Body Mapping Templates

动态添加头文件
  1. 创建和授权器Lambda(您可以使用授权器蓝图Lambda开始),执行业务逻辑以创建AuthPolicy并使用键/值填充上下文对象。
  2. 在API网关上,选择资源,单击方法请求并将Auth设置为您的Authorizer lambda
  3. 打开方法执行,选择集成类型并确保取消选择使用Lambda代理集成(如果您的请求指向Lambda)
  4. 添加一个主体映射模板 -从模板中创建一个,这是您可以访问$context.authorizer.key
  5. 的地方
  6. 将以下内容添加到模板中(就在"body-json"下面:$input.json('$')," is fine ")
"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等到上游服务

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

  1. 创建lambda
  2. 方法请求下添加lambda作为您的授权人
  3. 打开集成请求
  4. 打开HTTP头文件
  5. 添加你想要的标题(key-header在上面的例子中)
  6. 使用context.authorizer.yourKey作为条目映射的。(注意不要在这个字段中使用$)

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

映射头值

这些答案似乎是特定于HTTP API网关的。我们正在尝试使用RestAPI API网关,这将与Lambdas一起工作(将pricnipalID作为Lambda Authorizer转发的事件对象的一部分),但是,我们也想授权非Lambda端点(部署在私有VPC中并通过网络负载均衡器访问),所以我们想将principalId放入端点将解析的HTTP头中。

最新更新