aws-lambda - 当请求无效的 API 网关端点时,返回更友好的响应正文

标签 aws-lambda aws-api-gateway serverless-framework lambda-authorizer

我正在使用Serverless framework创建一个 API。端点在 serverless.yml 文件中定义,创建 API 网关端点,这些端点通过自定义 Authorizer 函数进行路由并解析为 Go Lambda 函数。

但是,如果客户端访问尚未显式定义的端点,并在 Authorization header 中传入其 JWT token ,API Gateway 将返回 403 Forbidden 响应,其中包含以下正文:

{
  "message": "'{{JWT TOKEN}}' not a valid key=value pair (missing equal-sign) in Authorization header: 'Bearer {{JWT TOKEN}}'"
}

403 Forbidden 状态似乎合适,但我想在响应正文中向我的客户发送更容易理解的错误消息。

当请求无效端点时,是否可以修改响应正文?

最佳答案

不幸的是,无服务器框架(尚)不支持原生自定义 API Gateway 默认响应。 有一个existing issue如果您有兴趣关注它,请在存储库中。

目前,您必须使用 CloudFormation 来实现此目的。有number of options您可以使用customize error responses 。 您会想具体了解什么ResponseType你想改变。

对于您的用例,您正在寻找的似乎是 MISSING_AUTHENTICATION_TOKEN 响应类型。 这是一个您可以修改并添加到 serverless.yml 的示例(通过 resources 部分):

resources:
  Resources:
    MissingAuthenticationTokenGatewayResponse: # Custom name, you can change it
      Type: 'AWS::ApiGateway::GatewayResponse'
      Properties:
        ResponseType: MISSING_AUTHENTICATION_TOKEN # The Response Type to customize
        RestApiId:
          Ref: 'ApiGatewayRestApi'
        StatusCode: '403' # The returned HTTP code
        ResponseParameters:
          # Set CORS
          gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
          gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
        ResponseTemplates:
          application/json: |
            {
              "error": "$context.authorizer.customErrorMessage"
            }

ResponseTemplates中,您可以根据需要设置 JSON 输出。 此示例仅设置一个 error 属性,该属性将包含 Lambda 授权方输出 context 属性的属性 customErrorMessage 的值。 您可以详细了解这个here 。 如果需要,您也可以将其设置为静态字符串,但是能够动态更改代码中的错误消息是相当不错的。

关于aws-lambda - 当请求无效的 API 网关端点时,返回更友好的响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57292228/

相关文章:

amazon-web-services - AWS secret 管理器

amazon-web-services - 在 aws.com 上手动删除后无服务器 API 网关资源不会返回

python - 亚马逊 (AWS) API 网关 - 身份验证

go - 为什么 AWS API Gateway websocket 发送错误

amazon-web-services - AWS Lambda 和 API Gateway Endpoint 响应中的调试错误

node.js - 如何 - AWS Rest API 身份验证

git - 如何在 Terraform 中使用 git 存储库作为 AWS Lambda 源?

amazon-web-services - Marklogic 8 http-get 到 AWS API 网关导致 SSL 握手失败

amazon-web-services - 如何使用 CloudFormation 创建多个 AWS API Gateway Stage 路径

amazon-web-services - 无服务器/AWS Lambda - 为已发布的 lambda 版本创建触发器