AWS APIGateway с Cognito Authorizer, определенным в спецификации OpenAPI - PullRequest
0 голосов
/ 28 мая 2019

Инструменты

  • Terraform v0.11.14

Настройка

  • API-шлюз, управляемый Terraform, определенный с использованием спецификации OpenAPI
  • Cognito Authorizer

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

Manual Cognito Authorizer

Задача

Я хочу иметь возможность установить это программно, используя спецификацию 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:

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

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

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

  endpoint_configuration {
    types = ["REGIONAL"]
  }
}

Ответы [ 2 ]

1 голос
/ 03 июня 2019

У меня была такая же проблема.Вот пример спецификации 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)

0 голосов
/ 03 июня 2019

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

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

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

, что в YAML означает:

security:
- MyUserPool: []

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

...