2016-07-26 55 views
8

从API网关,我使用Python中的Lambda函数为我的API创建了一个custom authorizer。 API网关使用我配置的标头(method.request.header.Authorization)移交传入的授权令牌。不过,我也需要在我的lambda函数中使用原始http请求的其他头文件。我如何访问它们?我没有看到event对象输入到我的lambda函数的头文件。如何访问定制授权者中的http头部AWS lambda函数

请注意,这不是How to access HTTP headers for request to AWS API Gateway using Lambda?的重复。问题是关于自定义授权者lambda函数。我没有看到任何配置选项将传入的http头传递给授权者lambda函数。

根据AWS Documentation,API网关使用下面的输入调用Custom Authorizer。基于下面,我假设我的问题是不可能的。但要检查是否有解决方法。

 

{ 
    "type":"TOKEN", 
    "authorizationToken":"", 
    "methodArn":"arn:aws:execute-api:<regionId>:<accountId>:<apiId>/<stage>/<method>/<resourcePath>" 
} 
+0

不可能。为什么你需要多个标题?解决方法:自己在集成的Lambda函数中处理认证/授权。 – hellomichibye

回答

1

不幸的是,目前这是不可能的,但我们计划增加对此的支持以及对定制授权人的一些其他改进。我目前没有ETA提供。

+0

是当前处理某种请求身份验证的最佳方式(如验证需要来自请求头,查询字符串和有效内容的数据的签名,类似于AWS V4),然后在接收方中实际执行自己的验证Lambda(或映射到API网关端点的Lambda集)? – Numbat

+2

我需要将此功能添加到Amazon api网关中,因为在我的使用情况下,我需要访问http头以获取X-API-KEY并与令牌授权人一起验证。让我们尽快将你的功能加起来。 –

+2

自这一年以来有任何更新? –

0

接下来,我们非常喜欢这个功能。 只有头部授权的结果是,我们只能授权所有基于相同逻辑的lambda函数,尽管这不是我们想要的。

作为一种变通方法,我们已经讨论了解决方案,包括在标题更多的数据(这不是最优的)

否则总有在lambda函数本身做具体授权的可能性,但在这种情况下, ,我们真的没有用于定制API网关授权人。

2

这是现在可以通过使用Authoriser类型的“请求”,而不是令牌

全部细节在这里: http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html

从根本上说,所有的报头中的事件对象传递一个请求授权

即头对象的事件


    "headers": { 
     "X-wibble": "111", 
     "X-wobble": "222", 
     "x-amzn-ssl-client-hello": "*Deleted*", 
     "Via": "1.1 .cloudfront.net (CloudFront)", 
     "CloudFront-Is-Desktop-Viewer": "true", 
     "CloudFront-Is-SmartTV-Viewer": "false", 
     "CloudFront-Forwarded-Proto": "https", 
     "X-Forwarded-For": "*Deleted*", 
     "CloudFront-Viewer-Country": "GB", 
     "Accept": "*/*", 
     "User-Agent": "curl/7.55.1", 
     "X-Amzn-Trace-Id": "Root=*Deleted*", 
     "Host": "*Deleted*.execute-api.eu-west-1.amazonaws.com", 
     "X-Forwarded-Proto": "https", 
     "X-Amz-Cf-Id": "*Deleted*", 
     "CloudFront-Is-Tablet-Viewer": "false", 
     "X-Forwarded-Port": "443", 
     "CloudFront-Is-Mobile-Viewer": "false" 
    }