从API网关,我使用python中的Lambda函数为我的API创建了custom authorizer。 API Gateway使用我配置的标头(method.request.header.Authorization
)移交传入的身份验证令牌。但是我还需要lambda函数中原始http请求的其他头文件。我如何访问它们?我没有看到event
对象上的标题输入到我的lambda函数。
请注意,这不是How to access HTTP headers for request to AWS API Gateway using Lambda?的副本。问题是关于自定义授权者lambda函数。我没有看到任何配置选项将传入的http标头传递给授权者lambda函数。
根据AWS Documentation,API Gateway使用以下输入调用Custom Authorizer。基于以下内容,我认为我的要求是不可能的。但是想检查是否有解决方法。
{ "type":"TOKEN", "authorizationToken":"", "methodArn":"arn:aws:execute-api:<regionId>:<accountId>:<apiId>/<stage>/<method>/<resourcePath>" }
答案 0 :(得分:3)
现在可以使用“请求”类型的授权程序代替令牌
详细信息如下: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-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"
}
答案 1 :(得分:1)
不幸的是,目前这是不可能的,但我们计划增加对此的支持以及对自定义授权者的一些其他改进。我目前没有提供ETA。
答案 2 :(得分:0)
就这样,我们非常喜欢这个功能。 只有头部进行授权的结果是我们只能基于相同的逻辑来授权我们所有的lambda函数,即使这不是我们想要的。
作为一种解决方法,我们已经讨论了在标题中包含更多数据的解决方案(这不是最优的)
否则,总是有可能在lambda函数本身中进行特定授权,但在这种情况下,我们实际上没有使用自定义API网关授权程序。
答案 3 :(得分:0)
这是SAM模板:
ApiGatewayApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
Auth:
Authorizers:
MyAuthorizer:
FunctionPayloadType: REQUEST
FunctionArn: !GetAtt AuthLambda.Arn
Identity:
Headers:
- X-API-KEY
- X-API-ID
答案 4 :(得分:0)
有几种方法可以做到这一点。
您可以定义 SAM 模板(API 网关),在 headers 下,您可以定义多个 headers,您可以在应用程序中检索它们。
在请求中,可以得到多个customheaders
"headers": {
"Access-Control-Allow-Origin": {
"type": "string",
"description": "URI that may access the resource"
},
"Access-Control-Allow-Methods": {
"type": "string",
"description": "Method or methods allowed when accessing the resource"
},
"Access-Control-Allow-Headers": {
"type": "string",
"description": "Used in response to a preflight request to indicate which HTTP headers can be used when making the request."
}
}
关注link会有所帮助