AWS APIGateway с авторизатором Cognito, определенным в спецификации OpenAPI

Инструменты

  • Терраформ v0.11.14

Настраивать

  • Шлюз API, управляемый Terraform, определенный с помощью спецификации OpenAPI.
  • Когнито-авторизатор

Я пытаюсь указать Authorizer для метода в моем API. Я могу сделать это с помощью консоли (это довольно хорошо задокументировано):

AWS APIGateway с авторизатором Cognito, определенным в спецификации OpenAPI

Проблема

Я хочу иметь возможность установить это программно, используя спецификацию OpenAPI. Соответствующая документация от AWS — здесь.

В нем говорится, что вы можете создать объект Authorizer в спецификации OpenAPI, указав:

securitySchemes:
  NameOfCognitoAuthorizer:
    type: apiKey
    name: Authorization
    in: header
    x-amazon-apigateway-authtype: cognito_user_pools
    x-amazon-apigateway-authorizer:
      type: cognito_user_pools
      providerARNs:
      - 'arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}'

Это работает, как и ожидалось.

И затем, как только это будет сделано, вы сможете применить Authorizer к методу ресурса следующим образом:

post:
  summary: Create a new Item
  responses:
    '200':
      description: Ok
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Item'
  security:
    - NameOfCognitoAuthorizer:

Однако, как только я применю изменения и проверю метод публикации в консоли AWS, я увижу, что авторизатор не был применен к методу API. Может ли кто-нибудь увидеть, что я сделал неправильно?

Для полноты мой API создан с использованием terraform:

resource "aws_api_gateway_rest_api" "this" {
  name        = "MyAPI"
  body        = "${file("./api-spec.yaml")}"

  endpoint_configuration {
    types = ["REGIONAL"]
  }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
2 300
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я столкнулся с той же проблемой и обнаружил, что это связано с тем, как я установил свойство security в методе.

Пример JSON, представленный в Документы AWS:

"security": [
  {
    "MyUserPool": []
  }
],

что в YAML переводится как:

security:
- MyUserPool: []

Обратите внимание на явную настройку пустого массива. Надеюсь, это решит это и для вас.

Ответ принят как подходящий

Я была такая же проблема. Вот пример спецификации OpenAPI, которая работает:

openapi: 3.0.0
info:
  title: Sample API
  description: api description here
  version: '0.1'
paths:
  /:
    get:
      summary: Describe the endpoint
      responses:
        '200':
          description: "All good"
      security:
        - EndpointAuthorizer: ["test/read"]
      x-amazon-apigateway-integration:
        uri: arn:aws:apigateway:{region}:lambda:path/2015-03-31/functions/arn:aws:lambda:{region}:{account_id}:function:{function_name}/invocations
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        type: "aws_proxy"
components:
  securitySchemes:
    EndpointAuthorizer:
      type: apiKey
      name: Authorization
      in: header
      x-amazon-apigateway-authtype: cognito_user_pools
      x-amazon-apigateway-authorizer:
        type: cognito_user_pools
        providerARNs:
          - arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}

Ключ — это ссылка безопасности на конечной точке (обратите внимание test/read здесь область, которую я определил в Cognito, но вы можете использовать пустой массив []):

      security:
        - EndpointAuthorizer: ["test/read"]

В приведенном выше определении AWS будет импортировать Cognito Authorizer (в моем случае с именем EndpointAuthorizer), как определено в components.securitySchemes, но вместо этого вы можете создать его с помощью Terraform, если хотите (просто убедитесь, что вы удалили его из спецификации OpenAPI)

Существует тонкое, но очень важное отличие, если вы используете пустой массив: пустой массив будет пытаться пройти проверку как токен идентификатора, тогда как, если у вас есть одно или несколько значений в нем, он будет проверять носитель как токен доступа.

Sleavely 31.10.2021 21:06

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