使用无服务器框架定义 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

除此之外:

  1. 在 AWS 控制台中打开 API 网关时,我没有文档中显示的 Develop 部分。
  2. 如果我尝试从 AWS 控制台手动创建授权程序,则没有 response mode 部分。

有两个可能的问题。

  1. REST API 的自定义授权方的响应不正确(这就是 http event 在无服务器中的情况)。 Output from an Amazon API Gateway Lambda authorizer 显示输出应该是什么样子,以及需要什么。
  2. 您打算使用 HTTP API。在这种情况下,您应该将 event 更改为 httpApiAnnouncing Support for AWS HTTP APIs

SLS 对此进行了记录 here

您可以像这样设置授权方响应格式的属性:

authorizer:
    payloadVersion: 2.0
    enableSimpleResponses: true

这将允许 isAuthorized:true|false 回复