Аутентификация

Система поддерживает аутентификацию запросов по авторизационным токенам (JSON Web Token, также JWT).

Если аутентификация включена, каждый запрос должен содержать авторизационный токен. Система проверяет предоставленный авторизационный токен и разрешает доступ, только если токен корректен и достоверен.

После проверки авторизационного токена его значение sub записывается в лог Prostore как часть идентификатора запроса. Это позволяет при необходимости сопоставить запросы с пользователями и внешними системами, отправившими эти запросы.

JVM-метрики, а также метод /swagger-ui доступны без аутентификации.

Система проверяет авторизационные токены, но не создает их, как и публичные ключи. Для создания публичных ключей и авторизационных токенов можно использовать любой авторизационный сервис, поддерживающий стандарт JWT, например Keycloak.

Включение аутентификации

Чтобы включить аутентификацию запросов в системе, задайте в конфигурации путь к API-методу авторизационного сервиса, возвращающему информацию о публичных ключах. Эта информация будет использоваться системой для проверки авторизационных токенов. Путь задается с помощью параметра AUTH_JWKS_URI.

Передача авторизационного токена

При отправке запроса по JDBC авторизационный токен должен быть передан как пароль пользователя. В качестве имени пользователя необходимо указать jwt.

Инструкции по настройке подключения в SQL-клиенте доступны в разделе Подключение с помощью SQL-клиента.

При отправке запроса по REST API авторизационный токен должен быть передан в заголовке типа Authorization после ключевого слова Bearer, как показано в примере ниже.

curl -X 'POST' \
  'http://localhost:9090/api/v1/datamarts/query?format=json' \
  -H 'x-request-id: ee7c7570-1eec-11ed-861d-0242ac120002' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
  -d '{
  "query": "SELECT st.id, st.category, s.product_code FROM marketing.stores AS st INNER JOIN marketing_new.sales AS s ON st.id = s.store_id DATASOURCE_TYPE = '\''adb'\''",
  "queryId": "12345"
}'

Добавление и обновление публичных ключей

Кэш публичных ключей, хранящийся в системе, автоматически обновляется при каждом старте сервера системы.

Чтобы добавить или обновить кэш публичных ключей без рестарта сервера, выполните CHECK_JWKS.

Порядок проверки авторизационного токена

Система проверяет авторизационный токен в следующем порядке:

  1. Декодирует токен и получает доступ к данными токена: подписи, алгоритму подписи, идентификатору публичного ключа и другим данным.
  2. Находит в кэше публичный ключ с соответствующим идентификатором и с его помощью проверяет подпись токена.
  3. Проверяет параметры токена: поля exp, nbf и iat и другие.
  4. Отклоняет запрос, если токен не прошел проверку по любому из параметров.