Расширение x-yc-apigateway-authorizer:function
Расширение x-yc-apigateway-authorizer:function используется внутри схем компонента securityScheme
Для авторизации HTTP-запроса API Gateway вызывает указанную в расширении функцию. Подробнее о структуре запроса и ответа.
Поддерживаемые параметры
В таблице ниже перечислены параметры, специфичные для API-шлюза сервиса API Gateway. Описание остальных параметров читайте в спецификации OpenAPI 3.0
| Параметр | Тип | Описание |
|---|---|---|
function_id |
string |
Идентификатор функции. |
tag |
string |
Необязательный параметр. Тег версии функции. Значение по умолчанию — $latest.В tag осуществляется подстановка параметров. |
service_account_id |
string |
Идентификатор сервисного аккаунта. Используется для авторизации при обращении к функции. Если параметр не указан, используется значение верхнеуровневого параметра service_account_id. Если верхнеуровневого параметра нет, функция вызывается без авторизации. |
authorizer_result_ttl_in_seconds |
int |
Необязательный параметр. Время, в течение которого ответ функции хранится в локальном кеше API Gateway. Если параметр не указан, ответ не кешируется. |
authorizer_result_caching_mode |
string |
Необязательный параметр. Режим кеширования результата авторизации. Для использования необходимо также указать параметр authorizer_result_ttl_in_seconds. Возможные значения: path, uri. |
Спецификация расширения
Пример спецификации для схемы с типом HTTP Basic:
paths:
/http/basic/authorize:
get:
summary: Authorized operation with http basic security scheme
operationId: httpBasicAuthorize
security:
- httpBasicAuth: [ ]
x-yc-apigateway-integration:
type: dummy
content:
'*': "Authorized!"
http_code: 200
http_headers:
'Content-Type': "text/plain"
components:
securitySchemes:
httpBasicAuth:
type: http
scheme: basic
x-yc-apigateway-authorizer:
type: function
function_id: b095c95icnvb********
tag: "$latest"
service_account_id: ajehfe84hhl********
authorizer_result_ttl_in_seconds: 300
Структура запроса
JSON-структура запроса к функции:
{
"resource": <ресурс, соответствующий запросу в спецификации>,
"path": <фактический путь запроса>,
"httpMethod": <название HTTP-метода>,
"headers": <словарь со строковыми значениями HTTP-заголовков>,
"queryStringParameters": <словарь queryString-параметров>,
"pathParameters": <словарь значений параметров пути запроса>,
"requestContext": <словарь с контекстом запроса>,
"cookies": <словарь, содержащий cookies запроса>
}
Структура ответа
JSON-структура ответа:
{
"isAuthorized": <результат авторизации — true или false>,
"context": <словарь с контекстом авторизации>
}
Пример функции
Пример функции, в которой используется структура ответа с контекстом авторизации:
exports.handler = async function (event, context) {
let response = {
"isAuthorized": false
};
if (event.headers.Authorization === "secretToken") {
response = {
"isAuthorized": true,
"context": {
"stringKey": "value",
"numberKey": 1,
"booleanKey": true,
"arrayKey": ["value1", "value2"],
"mapKey": {"value1": "value2"}
}
};
}
return response;
};
secretToken — это авторизационные данные зарегистрированного пользователя или доверенного клиента, например Basic <base64(логин:пароль)> или Bearer <JWT-токен>.
Кеширование
Ответ функции сохраняется в локальном кеше API Gateway, если в расширении задан параметр authorizer_result_ttl_in_seconds.
Состав ключа кеширования зависит от типа авторизации и значения параметра authorizer_result_caching_mode.
| Тип авторизации | Режим кеширования path |
Режим кеширования uri |
Режим кеширования не указан |
|---|---|---|---|
| HTTP Basic |
path, operation (HTTP-метод) и заголовок Authorization |
uri, operation (HTTP-метод) и заголовок Authorization |
path, operation (HTTP-метод) и заголовок Authorization |
| HTTP Bearer |
path, operation (HTTP-метод) и заголовок Authorization |
uri, operation (HTTP-метод) и заголовок Authorization |
path, operation (HTTP-метод) и заголовок Authorization |
| API Key |
path, operation (HTTP-метод) и API-ключ |
uri, operation (HTTP-метод) и API-ключ |
path, operation (HTTP-метод) и API-ключ |
Например, для следующей спецификации при выполнении запроса /user/123 ключ кеширования сформируется из значения /user/{id}, GET и значения заголовка Authorization. Если изменить значение параметра authorizer_result_caching_mode на uri, ключа кеширования сформируется из /user/123, GET и значения заголовка Authorization.
paths:
/user/{id}:
get:
summary: Authorized operation with http basic security scheme
operationId: httpBasicAuthorize
parameters:
- in: path
name: id
schema:
type: integer
required: true
description: Numeric ID of the user to get
security:
- httpBasicAuth: [ ]
x-yc-apigateway-integration:
type: dummy
content:
'*': "Authorized!"
http_code: 200
http_headers:
'Content-Type': "text/plain"
components:
securitySchemes:
httpBasicAuth:
type: http
scheme: basic
x-yc-apigateway-authorizer:
type: function
function_id: b095c95icnvb********
tag: "$latest"
service_account_id: ajehfe84hhl********
authorizer_result_ttl_in_seconds: 300
authorizer_result_caching_mode: path
Если в течение времени, указанного в параметре authorizer_result_ttl_in_seconds, повторно придет HTTP-запрос с аналогичными составляющими ключа кеширования, API Gateway использует ответ, сохраненный в кеше, и не будет вызывать функцию.
Контекст авторизации
Если авторизация прошла успешно, при вызове другой пользовательской функции контекст авторизации будет передан в запросе внутри поля requestContext.authorizer. Контекст авторизации может содержать данные, идентифицирующие пользователя, от которого пришел HTTP-запрос.
Возможные ошибки
401 Unauthorized— клиент не передал в HTTP-запросе авторизационные данные, которые определены схемой (например, заголовокAuthorizationдля схемы с типом HTTP Basic ).403 Forbidden— API Gateway неуспешно вызвал функцию ("isAuthorized": false).500 Internal Server Error— API Gateway не смог вызвать функцию или получил от нее ответ с некорректной структурой.