Создать ответ для недействительных и неполных конечных точек, используя Serverless Framework?

У меня есть ряд конечных точек HTTP, которые включают лямбда-функции, которые обращаются к подробной информации, например:

products/1
users/1
package/998134

Не существует соответствующей конечной точки для products/, users/ или же package/, У меня есть собственный авторизатор по всему users/{id} а также package/{id} конечные точки.

Если пользователь идет в users/ или же packages/ с помощью GET они получают {"message":"Missing Authentication Token"}, Если они попадают в эти конечные точки с POST (допустимая опция для моей конечной точки, если они также должны были передать идентификатор), они получают

{'message': "Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=MYTOKENHERE"}

Есть ли способ настроить любое из этих сообщений? Моей первой мыслью было просто создать связанные конечные точки:

GET users/
POST users/
GET products/
POST products/
GET package/
POST package

Но это быстро становится большой работой, потому что у меня есть более трех из этих конечных точек. Мне тоже нужно включить DELETE а также PUT на некоторых из них.

Могу ли я легко создать ответ для недействительных или неполных конечных точек?

Мой serverless.yml в настоящее время имеет следующие определения:

show_user:
  handler: users/show_users.return_user
  events:
    - http:
        path: users/{id}
        method: get
        cors: true
update_user:
  handler: users/update_user.update_user
  events:
    - http:
        path: users/{id}
        method: post
        cors: true
        authorizer: ${self:custom.authorizer.users}

2 ответа

Решение

Мне нужно было сделать что-то подобное в последнее время. Я сделал это с такой конфигурацией:

error_messages:
  handler: custom_errors/errors.invalid_path
  events:
    - http
        path: users/
        method: any
    - http
        path: product/
        method: any
    - http
        path: package/
        method: any

Затем создайте обработчик в указанном месте и верните желаемый результат. В этом случае обработчик будет custom_errors/errors.invalid_path

В моем случае я вернул HTTP 404 с пользовательским сообщением о том, что {id} требовалось

method: any line будет перехватывать все HTTP-глаголы, поэтому вам нужно будет добавить только три строки для каждой конечной точки, на которой вы хотите эту защиту, вместо группы для каждого отдельного HTTP-глагола.

Я сделал это с помощью функции {proxy+} catchall в ApiGateway следующим образом:

no-endpoint:
    description: catch all non-existent enpoints with 404 - must be 
last http
    handler: src/functions/api-controller.noEndpoint
    events:
      - http:
          path: /{proxy+}
          method: any
          cors: true

Примечание: это ДОЛЖНА быть последняя конечная точка http в вашем файле без сервера, чтобы другие действительные конечные точки не были перехвачены. Вы можете прочитать больше об этом здесь:

https://aws.amazon.com/blogs/aws/api-gateway-update-new-features-simplify-api-development/

Другие вопросы по тегам