使用无服务器框架定义 lambda 授权方响应格式
Define lambda authorizer response format using serverless framework
根据 to this AWS documentation page 涵盖 AWS API 网关的授权者,可以将授权者定义为 lambda 函数,将 isAuthorized
响应字段中的布尔值返回到 allow/deny API请求。
然而,经过无数次尝试后,我无法理解如何在 serverless.yml
(或至少在 AWS 控制台)中定义它
我是 AWS 和无服务器框架的新手。我决定暂时不深入研究 IAM
访问策略或 Cognito
,因此我正在尝试构建一个非常简单的 lambda 授权函数,它只产生一个布尔值 allow/deny API访问。
我在 serverless.yml
中定义了我的 functions
部分,如下所示:
functions:
add_content:
handler: src.handler.add
module: src/handler
events:
- http:
path: /content
method: post
authorizer: customAuthorizer
customAuthorizer:
handler: src.authorizer.authorize
module: src/authorizer
授权器功能很简单:
def authorize(event, context):
response = {"isAuthorized": True}
return response
但是,如果我尝试对其进行测试,我会看到以下 CloudWatch
堆栈跟踪:
Mon May 03 20:06:11 UTC 2021 : Endpoint request body after transformations: {"type":"TOKEN","methodArn":"arn:aws:execute-api:eu-central-1:238758647165:ww9wzq8hp8/ESTestInvoke-stage/GET/","authorizationToken":"123456789"}
Mon May 03 20:06:11 UTC 2021 : Sending request to https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:238758647165:function:sls-playground-dev-customAuthorizer/invocations
Mon May 03 20:06:11 UTC 2021 : Authorizer result body before parsing: {"isAuthorized": true}
Mon May 03 20:06:11 UTC 2021 : Execution failed due to configuration error: Invalid JSON in response: Unrecognized field "isAuthorized" , not marked as ignorable
Mon May 03 20:06:11 UTC 2021 : AuthorizerConfigurationException
除此之外:
- 在 AWS 控制台中打开 API 网关时,我没有文档中显示的
Develop
部分。
- 如果我尝试从 AWS 控制台手动创建授权程序,则没有
response mode
部分。
有两个可能的问题。
- REST API 的自定义授权方的响应不正确(这就是
http
event
在无服务器中的情况)。 Output from an Amazon API Gateway Lambda authorizer 显示输出应该是什么样子,以及需要什么。
- 您打算使用 HTTP API。在这种情况下,您应该将
event
更改为 httpApi
:Announcing Support for AWS HTTP APIs
SLS 对此进行了记录 here
您可以像这样设置授权方响应格式的属性:
authorizer:
payloadVersion: 2.0
enableSimpleResponses: true
这将允许 isAuthorized:true|false
回复
根据 to this AWS documentation page 涵盖 AWS API 网关的授权者,可以将授权者定义为 lambda 函数,将 isAuthorized
响应字段中的布尔值返回到 allow/deny API请求。
然而,经过无数次尝试后,我无法理解如何在 serverless.yml
(或至少在 AWS 控制台)中定义它
我是 AWS 和无服务器框架的新手。我决定暂时不深入研究 IAM
访问策略或 Cognito
,因此我正在尝试构建一个非常简单的 lambda 授权函数,它只产生一个布尔值 allow/deny API访问。
我在 serverless.yml
中定义了我的 functions
部分,如下所示:
functions:
add_content:
handler: src.handler.add
module: src/handler
events:
- http:
path: /content
method: post
authorizer: customAuthorizer
customAuthorizer:
handler: src.authorizer.authorize
module: src/authorizer
授权器功能很简单:
def authorize(event, context):
response = {"isAuthorized": True}
return response
但是,如果我尝试对其进行测试,我会看到以下 CloudWatch
堆栈跟踪:
Mon May 03 20:06:11 UTC 2021 : Endpoint request body after transformations: {"type":"TOKEN","methodArn":"arn:aws:execute-api:eu-central-1:238758647165:ww9wzq8hp8/ESTestInvoke-stage/GET/","authorizationToken":"123456789"}
Mon May 03 20:06:11 UTC 2021 : Sending request to https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:238758647165:function:sls-playground-dev-customAuthorizer/invocations
Mon May 03 20:06:11 UTC 2021 : Authorizer result body before parsing: {"isAuthorized": true}
Mon May 03 20:06:11 UTC 2021 : Execution failed due to configuration error: Invalid JSON in response: Unrecognized field "isAuthorized" , not marked as ignorable
Mon May 03 20:06:11 UTC 2021 : AuthorizerConfigurationException
除此之外:
- 在 AWS 控制台中打开 API 网关时,我没有文档中显示的
Develop
部分。 - 如果我尝试从 AWS 控制台手动创建授权程序,则没有
response mode
部分。
有两个可能的问题。
- REST API 的自定义授权方的响应不正确(这就是
http
event
在无服务器中的情况)。 Output from an Amazon API Gateway Lambda authorizer 显示输出应该是什么样子,以及需要什么。 - 您打算使用 HTTP API。在这种情况下,您应该将
event
更改为httpApi
:Announcing Support for AWS HTTP APIs
SLS 对此进行了记录 here
您可以像这样设置授权方响应格式的属性:
authorizer:
payloadVersion: 2.0
enableSimpleResponses: true
这将允许 isAuthorized:true|false
回复