Инструменты
Настраивать
Я пытаюсь указать Authorizer для метода в моем API. Я могу сделать это с помощью консоли (это довольно хорошо задокументировано):
Проблема
Я хочу иметь возможность установить это программно, используя спецификацию 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"]
}
}
Я столкнулся с той же проблемой и обнаружил, что это связано с тем, как я установил свойство 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)
Существует тонкое, но очень важное отличие, если вы используете пустой массив: пустой массив будет пытаться пройти проверку как токен идентификатора, тогда как, если у вас есть одно или несколько значений в нем, он будет проверять носитель как токен доступа.