Расширение x-yc-apigateway-authorizer:jwt
Расширение x-yc-apigateway-authorizer:jwt
используется внутри схем компонента securityScheme
Поддерживаемые параметры
В таблице ниже перечислены параметры, специфичные для API-шлюза сервиса API Gateway. Описание остальных параметров читайте в спецификации OpenAPI 3.0
Параметр | Тип | Параметр обязателен | Описание |
---|---|---|---|
jwksUri |
string |
Нет | Адрес, по которому можно получить публичный ключ для проверки подписи JWT. Ключи должны быть описаны в формате JWKSjwks_uri . Файл конфигурации доступен по адресу из стандартного параметра openIdConnectUrl . |
identitySource |
IdentitySource |
Да | Указывает на место, где в запросе находится токен. |
issuers |
string[] |
Нет | Возможные значения поля iss валидируемого токена. |
audiences |
string[] |
Нет | Возможные значения поля aud валидируемого токена. |
requiredClaims |
string[] |
Нет | Поля тела JWT, которые должны присутствовать в каждом валидируемом токене. |
authorizer_result_ttl_in_seconds |
int |
Нет | Время, в течение которого результат авторизации хранится в локальном кеше API Gateway. Если параметр не указан, ответ не кешируется. |
authorizer_result_caching_mode |
string |
Нет | Режим кеширования результата авторизации. Для использования необходимо также указать параметр authorizer_result_ttl_in_seconds . Возможные значения: path , uri . |
jwkTtlInSeconds |
int |
Нет | Время, в течение которого публичный ключ из ответа на запрос, адрес которого указан в параметре jwksUri , хранится в локальном кеше API Gateway. Если параметр не указан, ключ не кешируется. |
При этом указывать стандартный для спецификации OpenAPI 3.0openIdConnectUrl
необязательно, если указан параметр jwksUri
.
Объект IdentitySource
может содержать следующие параметры:
Параметр | Тип | Описание |
---|---|---|
in |
string |
Местонахождение токена. Возможные значения: header , query , cookie — токен лежит в заголовке, параметре запроса или куки соответственно. |
name |
string |
Название переменной, в которой лежит токен. Например, название заголовка или переменной запроса. |
prefix |
string |
Необязательный параметр. Префикс токена. Значение по умолчанию: пустая строка. |
Поддерживаемые алгоритмы подписи
Алгоритм подписи | Значение поля alg |
---|---|
RSASSA-PKCS1-v1_5 и SHA-256 |
RS256 |
RSASSA-PKCS1-v1_5 и SHA-384 |
RS384 |
RSASSA-PKCS1-v1_5 и SHA-512 |
RS512 |
ECDSA с функцией P-256 и SHA-256 |
ES256 |
ECDSA с функцией P-384 и SHA-384 |
ES384 |
ECDSA с функцией P-521 и SHA-512 |
ES512 |
Алгоритм авторизации вызова API
Авторизация запросов с помощью JWT выполняется по следующему алгоритму:
-
API Gateway проверяет наличие токена в
identitySource
и удаляет из него префикс, если он указан в спецификации. -
Если в спецификации разрешено кеширование результата авторизации и время жизни закешированной записи не истекло, API Gateway возвращает закешированный результат авторизации. Иначе — декодирует заголовок и тело токена.
-
API Gateway определяет адрес получения публичного ключа, необходимого для валидации электронной подписи JWS
токена. Для этого используется значение параметраjwksUri
. Если в спецификации не указан параметрjwksUri
, API Gateway, используя значение стандартного для OpenAPI параметраopenIdConnectUrl
, делает запрос на указанный в параметре адрес и извлекает адрес публичных ключей из поляjwks_uri
, расположенного в теле ответа. -
Если в спецификации разрешено кеширование публичных ключей и время жизни закешированной записи не истекло, API Gateway использует адрес получения публичных ключей и идентификатор публичного ключа (задан в поле
kid
заголовка JWT), чтобы попытаться извлечь публичный ключ из локального кеша. Иначе — делает запрос на получение публичного ключа по адресу. Из тела ответа выбирается публичный ключ, идентификатор которого соответствует значению поляkid
в заголовке JWT. Полученный публичный ключ кешируется, если это предусматривает спецификация. -
API Gateway проверяет соответствие алгоритмов подписи токена и публичного ключа.
-
API Gateway проверяет подпись токена.
-
API Gateway проверяет поля тела токена:
exp
— должно быть больше текущего времени в UTC.nbf
— должно быть меньше текущего времени в UTC.iat
— должно быть меньше текущего времени в UTC.iss
— должно иметь одно из значений, указанных в параметре спецификацииissuers
.aud
— должно иметь одно из значений, указанных в параметре спецификацииaudiences
.
Подробнее о полях читайте в стандарте JWT
. -
API Gateway проверяет, что в теле токена содержатся поля, указанные в параметре спецификации
requiredClaims
. -
API Gateway проверяет, что у владельца токена (значение поля
scope
токена) есть все права, которые необходимы, чтобы получить запрашиваемый ресурс.
Если хотя бы одна из проверок не пройдена, API Gateway отказывает в доступе к запрашиваемому ресурсу и возвращает статус-код 403.
Спецификация расширения
Пример спецификации расширения:
paths:
/jwt/header/authorize:
get:
summary: Authorized operation with OpenId Connect security scheme and JWT in header
operationId: httpOpenIdAuthorizeWithJwtInHeader
security:
- jwtHeaderAuthorizer:
- profile:read
- profile:write
x-yc-apigateway-integration:
type: dummy
content:
'*': "Authorized!"
http_code: 200
http_headers:
'Content-Type': "text/plain"
components:
securitySchemes:
jwtHeaderAuthorizer:
type: openIdConnect
openIdConnectUrl: https://example.com/.well-known/openid-configuration
x-yc-apigateway-authorizer:
type: jwt
authorizer_result_ttl_in_seconds: 3000
jwkTtlInSeconds: 5000
jwksUri: https://example.com/.well-known/jwks.json
issuers:
- https://example.com
- https://example2.com
audiences:
- audience-1
- audience-2
identitySource:
in: header
name: Authorization
prefix: "Bearer "
requiredClaims:
- role
- email
В данном примере при обращении к ресурсу с названием /jwt/query/authorize
API Gateway валидирует токен, находящийся в заголовке Authorization
. Чтобы получить токен, из значения целевого заголовка удаляется префикс Bearer
.
Для успешной авторизации:
- подпись токена и стандартные поля должны быть корректны;
- токен должен содержать поля
role
иemail
; - значение поля
iss
должно быть равноhttps://example.com
илиhttps://example2.com
; - значение поля
aud
должно быть равноaudience-1
илиaudience-2
; - в токене должны быть указаны права
profile:read
иprofile:write
.
Кеширование результата авторизации
Результат авторизации сохраняется в локальном кеше API Gateway, если в расширении задан параметр authorizer_result_ttl_in_seconds
. Если в течение времени, указанного в параметре authorizer_result_ttl_in_seconds
, повторно придет HTTP-запрос с аналогичными составляющими ключа кеширования, API Gateway использует ответ, сохраненный в кеше, и не будет проверять подпись токена.
Состав ключа кеширования зависит от значения параметра authorizer_result_caching_mode
.
Режим кеширования path |
Режим кеширования uri |
Режим кеширования не указан |
---|---|---|
path , operation (HTTP-метод) и токен |
uri , operation (HTTP-метод) и токен |
path , operation (HTTP-метод) и токен |
Например, для идентификатора ресурса в спецификации /user/{id}
и в запросе /user/1234
при значении параметра authorizer_result_caching_mode
, равном path
, для формирования ключа кеширования будет использоваться /user/{id}
, а при значении, равном uri
, — /user/123
.
Кеширование публичных ключей
Публичный ключ, получаемый при обращении по адресу, указанному в параметре jwksUri
или в поле jwks_uri
файла конфигурации, сохраняется в локальном кеше API Gateway, если в расширении задан параметр jwkTtlInSeconds
.
При формировании ключа кеширования используется идентификатор публичного ключа (значение поля kid
из заголовка JWT) и адрес, по которому получен публичный ключ.
Если в течение времени, заданного в параметре jwkTtlInSeconds
, повторно придет HTTP-запрос, для проверки которого требуется получение публичного ключа с аналогичным адресом и идентификатором ключа kid
, API Gateway использует ответ, сохраненный в кеше, и не будет повторно запрашивать публичный ключ.
Контекст авторизации
Если авторизация прошла успешно, при вызове пользовательской функции-интеграции контекст JWT-авторизации будет передан в запросе внутри поля requestContext.authorizer.jwt
. Контекст JWT-авторизации содержит следующие параметры:
Параметр | Тип | Описание |
---|---|---|
claims |
map[string]string |
Поля тела токена. |
scopes |
list |
Права доступа владельца токена. |
Возможные ошибки
401 Unauthorized
— клиент не передал в HTTP-запросе авторизационные данные или передаваемый токен некорректен, например подпись невалидна, пропущены требуемые поля, истек срок жизни токена и прочее.403 Forbidden
— в токене отсутствуют права (полеscope
), необходимые для доступа к запрашиваемому ресурсу.500 Internal Server Error
— API Gateway не смог получить конфигурацию OpenID Connect или публичный ключ или возвращенное значение имеет некорректную структуру.