当前位置: 首页 > 知识库问答 >
问题:

通过无服务器设置API网关的请求验证器

隗高旻
2023-03-14

我想通过无服务器设置API网关的Request Validator。我尝试了两种不同的Request Validator设置。但是,两种方法都失败了。我已经总结了我所做的,所以如果有问题请告诉我。

  1. 我用swagger(OAS3.0)编写了API规范。因此,我尝试使用OAS扩展实现Request Validator的设置。在我使用下面的swagger.yamlserverless.yml部署了sls后,没有将x-amazon-apigateway-estest-validator中描述的验证模式添加到Request Validator选项中。https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-swagger-extensions-request-validator.html

下面是一个:

openapi: 3.0.0

info:
  description: xxx
  version: '0.1'
  title: xxx API
x-amazon-apigateway-request-validators:
  body-only:
    validateRequestBody: true,
    validateRequestParameters: false
  except-body:
    validateRequestBody: false,
    validateRequestParameters: true
  all:
    validateRequestBody: true,
    validateRequestParameters: true
tags:
  - name: auth
    description: xxx
paths:
  /login:
    post:
      tags:
        - auth
      summary: xxx
      description: ''
      x-amazon-apigateway-request-validator: all
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthResponse'
        '400':
          description: fail
          content:
            application/json
        '401':
          description: fail
          content:
            application/json
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AuthRequest'
        required: true
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "200"
        uri: "arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:xxx-api-dev-login/invocations"
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        contentHandling: "CONVERT_TO_TEXT"
        type: "aws_proxy"

我的是无服务器的。yml如下:

resources:
  Resources:
    RestApi :
      Type : AWS::ApiGateway::RestApi
      Properties :
        Body : ${file(./swagger.yaml)}
    LoginApiToInvokeLambda:
      Type: AWS::Lambda::Permission
      DependsOn: LoginLambdaFunction
      Properties:
        FunctionName: xxx-ext-api-dev-login
        Action: lambda:InvokeFunction
        Principal: apigateway.amazonaws.com
resources:
  Resources:
    RestApi :
      Type : AWS::ApiGateway::RestApi
      Properties :
        Body : ${file(./swagger.yaml)}
    LoginApiToInvokeLambda:
      Type: AWS::Lambda::Permission
      DependsOn: LoginLambdaFunction
      Properties:
        FunctionName: xxx-ext-api-dev-login
        Action: lambda:InvokeFunction
        Principal: apigateway.amazonaws.com
    RequestValidatorAll:
      Type: AWS::ApiGateway::RequestValidator
      Properties:
        Name: all
        RestApiId:
          Ref: RestApi
        ValidateRequestBody: true
        ValidateRequestParameters: true

共有1个答案

段干恺
2023-03-14

您需要删除YAML中的逗号。

x-amazon-apigateway-request-validators:  
 body-only:  
    validateRequestBody: true,  
    validateRequestParameters: false
  except-body:
    validateRequestBody: false,
    validateRequestParameters: true
  all:
    validateRequestBody: true,
    validateRequestParameters: true

应该是

x-amazon-apigateway-request-validators:
  body-only:
    validateRequestBody: true
    validateRequestParameters: false
  except-body:
    validateRequestBody: false
    validateRequestParameters: true
  all:
    validateRequestBody: true
    validateRequestParameters: true

一旦您这样做,YAML将是有效的,它应该工作。

 类似资料:
  • 在微服务体系结构中,有一种称为API网关的常见模式。 我知道所有来自API网关外部的通信都被用作单个入口点。 但是我也希望从微服务到微服务的内部通信是通过API网关进行的?我的意思是,这比建立点对点连接要容易得多。 那么,是什么反对将API网关也用于整个内部通信呢?

  • 我正在开发一个SAM应用程序,它有一个lambda函数,API网关是事件源。APIendpoint是一种POST方法,要求在请求体中有一组参数。API网关通过使用AWS控制台指定请求模型,为我们提供了验证请求体的能力。 请参阅以下AWS控制台选项的屏幕截图: 我需要通过SAM模板设置类似的选项,能够将模型与请求主体链接,但无法设置请求验证程序选项,也无法找到任何文档或示例。 下面是我的SAM模板

  • 问题内容: 我编写了以下bean来验证我的邮件。 问题在于smtp设置,当我在本地服务器上运行应用程序时,它运行正常。但是当我在openshift服务器上运行应用程序时,在 有人可以指出以上设置中的问题,为什么它们在我的本地计算机上工作? 以下是我得到的例外 问题答案: 我有同样的问题。尝试从浏览器登录到Gmail帐户。如果Gmail认为是非法访问(可能来自其他地理位置),则会阻止身份验证请求。您

  • 我需要使用拦截器验证并记录grpc服务请求的一些数据。我检查了ServerInterceptor的interceptCall,但找不到获取请求对象的方法。有没有办法让请求对象进入拦截器?

  • 我试图向google calendar api发出POST请求,但我不知道如何对其进行身份验证。 我采取了以下步骤尝试并使用服务帐户执行此操作: > <代码>{“error”:{“errors”:[{“domain”:“global”,“reason”:“authError”,“message”:“Invalid Credentials”,“locationType”:“header”,“loca

  • 以下情况: 我们使用第三方服务将文件上传到特定谷歌账户内的特定驱动器文件夹(唯一可能的方式) Zapier集成监听新文件的创建,并使用文件的元数据创建一个新的db条目 现在我想设置一个无服务器云函数,它可以监听新的数据库条目,从元数据中检索fileId,然后下载文件并立即上传到谷歌云存储 我的问题是实际验证这个下载请求。理想情况下,不会涉及OAUTH,因为它实际上是我们想要触摸的单一驱动器,我们也