我在 AWS API Gateway 上使用自定义身份验证,但我想根据结果添加额外的 HTTP 标头。有谁知道这是否可能,或者如何做到。如果不是,是否知道这是否或何时可能?
非常感谢。
我们最近添加了对此的支持。文档应该很快就会出来。
现在您可以从授权者函数返回这样的对象:
{
"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
,则标头值将为空白(但标头仍会发送)。
编辑:
经过一天的努力,我终于成功了,希望我能把别人从这样的困境中拯救出来。这为杰克斯的回应增添了更多内容。 基本上,您可以使用 Body Mapping Templates
动态添加标头"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 日)让它工作的方法是
key-header
)context.authorizer.yourKey
作为 映射自 条目。 (请注意,您不要在此字段中使用 $。)您只能从授权者结果中获取PrincipalId,在集成请求中,您可以使用
context.authorizer.principalId
映射标头值
这些答案似乎特定于 HTTP API 网关。我们正在尝试使用可与两个 Lambda 一起使用的 RestAPI API 网关(将 pricnipalID 作为 Lambda Authorizer 转发的事件对象的一部分),而且我们还希望授权非 Lambda 端点(部署在私有 VPC 中并通过网络负载均衡器),因此我们希望将principalId放入端点将解析的HTTP标头中。
Fima Furman,我尝试使用 Lambda 授权方的 RestAPI 端点解决方案,该授权方与私有 VPC 中部署的非 Lambda 端点进行通信。这对我有用。