Аутентификация в SDK
Как описано в статье о подключении к серверу YDB, клиент с каждым запросом должен отправить аутентификационный токен. Аутентификационный токен проверяется сервером и, в случае успешной аутентификации, запрос авторизуется и выполняется, иначе возвращается ошибка Unauthenticated
.
YDB SDK использует объект, отвечающий за генерацию таких токенов. SDK предоставляет встроенные cпособы получения такого объекта:
- Методы с явной передачей параметров, каждый из методов реализует один из режимов аутентификации.
- Метод определения режима аутентификации и необходимых параметров из переменных окружения.
Обычно объект генерации токенов создается перед инициализацией драйвера YDB и передается параметром в его конструктор. C++ и Go SDK дополнительно позволяют через один драйвер работать с несколькими БД и объектами генерации токенов.
Если объект генерации токенов не определен, драйвер не будет добавлять в запросы какой-либо аутентификационной информации. Такой подход позволяет успешно соединиться с локально развернутыми кластерами YDB без настроенной обязательной аутентификации. Если обязательная аутентификация настроена, то запросы к базе данных без аутентификационного токена будут отклоняться с выдачей ошибки аутентификации.
Методы создания объекта генерации токенов
На приведенные ниже методы можно кликнуть, чтобы перейти к исходному коду релевантного примера в репозитории. Также можно ознакомиться с рецептами кода Аутентификации.
Режим | Метод |
---|---|
Anonymous | ydb.AnonymousCredentials() |
Access Token | ydb.AccessTokenCredentials(token) |
Metadata | ydb.iam.MetadataUrlCredentials() |
Service Account Key | ydb.iam.ServiceAccountCredentials.from_file( key_file, iam_endpoint=None, iam_channel_credentials=None) |
Static Credentials | ydb.StaticCredentials.from_user_password(user, password) |
OAuth 2.0 token exchange | ydb.oauth2_token_exchange.Oauth2TokenExchangeCredentials(), ydb.oauth2_token_exchange.Oauth2TokenExchangeCredentials.from_file(cfg_file, iam_endpoint=None) |
Определяется по переменным окружения | ydb.credentials_from_env_variables() |
Режим | Пакет | Метод |
---|---|---|
Anonymous | ydb-go-sdk/v3 | ydb.WithAnonymousCredentials() |
Access Token | ydb-go-sdk/v3 | ydb.WithAccessTokenCredentials(token) |
Metadata | ydb-go-yc | yc.WithMetadataCredentials(ctx) |
Service Account Key | ydb-go-yc | yc.WithServiceAccountKeyFileCredentials(key_file) |
Static Credentials | ydb-go-sdk/v3 | ydb.WithStaticCredentials(user, password) |
OAuth 2.0 token exchange | ydb-go-sdk/v3 | ydb.WithOauth2TokenExchangeCredentials(options...), ydb.WithOauth2TokenExchangeCredentialsFile(configFilePath) |
Определяется по переменным окружения | ydb-go-sdk-auth-environ | environ.WithEnvironCredentials(ctx) |
Режим | Метод |
---|---|
Anonymous | tech.ydb.core.auth.NopAuthProvider.INSTANCE |
Access Token | new tech.ydb.core.auth.TokenAuthProvider(accessToken); |
Metadata | tech.ydb.auth.iam.CloudAuthHelper.getMetadataAuthProvider(); |
Service Account Key | tech.ydb.auth.iam.CloudAuthHelper.getServiceAccountFileAuthProvider(saKeyFile); |
OAuth 2.0 token exchange | tech.ydb.auth.OAuth2TokenExchangeProvider.fromFile(cfgFile); |
Определяется по переменным окружения | tech.ydb.auth.iam.CloudAuthHelper.getAuthProviderFromEnviron(); |
Режим | Метод |
---|---|
Anonymous | AnonymousAuthService() |
Access Token | TokenAuthService(accessToken, database) |
Metadata | MetadataAuthService(database) |
Service Account Key | getSACredentialsFromJson(saKeyFile) |
Static Credentials | StaticCredentialsAuthService(user, password, endpoint) |
Определяется по переменным окружения | getCredentialsFromEnv(entryPoint, database, logger) |
Режим | Метод |
---|---|
Anonymous | ydb::StaticToken("") |
Access Token | ydb::StaticToken(token) |
Metadata | ydb::GCEMetadata, ydb::YandexMetadata |
Service Account Key | не поддерживается |
Static Credentials | ydb::StaticCredentialsAuth |
Определяется по переменным окружения | не поддерживается |
Выполнение внешней команды | ydb.CommandLineYcToken (например, для авторизации с помощью IAM-токена Yandex.Cloud с компьютера разработчика ydb::CommandLineYcToken.from_cmd("yc iam create-token") ) |
Режим | Метод |
---|---|
Anonymous | AnonymousAuthentication() |
Access Token | AccessTokenAuthentication($accessToken) |
Oauth Token | OAuthTokenAuthentication($oauthToken) |
Metadata | MetadataAuthentication() |
Service Account Key | JwtWithJsonAuthentication(jsonFilePath)](https://github.com/ydb-platform/ydb-php-sdk#jwt--json-file) или [JwtWithPrivateKeyAuthentication(key_id, $service_account_id, $privateKeyFile) |
Определяется по переменным окружения | EnvironCredentials() |
Static Credentials | StaticAuthentication($user, $password) |
Порядок определения режима и параметров аутентификации из окружения
Выполняется следующий алгоритм, одинаковый для всех SDK:
- Если задано значение переменной окружения
YDB_SERVICE_ACCOUNT_KEY_FILE_CREDENTIALS
, то используется режим аутентификации System Account Key, а ключ загружается из файла, указанного в данной переменной. - Иначе, если задано значение переменной окружения
YDB_ANONYMOUS_CREDENTIALS
, равное 1, то используется анонимный режим аутентификации. - Иначе, если задано значение переменной окружения
YDB_METADATA_CREDENTIALS
, равное 1, то используется режим аутентификации Metadata. - Иначе, если задано значение переменной окружения
YDB_ACCESS_TOKEN_CREDENTIALS
, то используется режим аутентификации Access token, в который передается значение данной переменной. - Иначе, если задано значение переменной окружения
YDB_OAUTH2_KEY_FILE
, то используется режим аутентификации OAuth 2.0 token exchange, а настройки загружаются из JSON файла, указанного в данной переменной. - Иначе используется режим аутентификации Metadata.
Наличие последним пунктом алгоритма выбора режима Metadata позволяет развернуть рабочее приложение на виртуальных машинах и в Cloud Functions Yandex.Cloud без задания каких-либо переменных окружения.
Формат файла настроек для режима аутентификации OAuth 2.0 token exchange
Описание полей JSON файла настроек метода аутентификации OAuth 2.0 token exchange. Набор полей зависит от типа исходного токена, JWT
или FIXED
.
В таблице ниже creds_json
обозначает JSON с параметрами для исходного токена, обмениваемого на access token.
Поля, не описанные в этой таблице, игнорируются.
Поле | Тип | Описание | Значение по умолчанию/опциональность |
---|---|---|---|
grant-type |
string | Grant type | urn:ietf:params:oauth:grant-type:token-exchange |
res |
string | list of strings | Resource | опциональное |
aud |
string | list of strings | Опция audience для запроса обмена токена | опциональное |
scope |
string | list of strings | Scope | опциональное |
requested-token-type |
string | Тип получаемого токена | urn:ietf:params:oauth:token-type:access_token |
subject-credentials |
creds_json | Subject credentials | опциональное |
actor-credentials |
creds_json | Actor credentials | опциональное |
token-endpoint |
string | Token endpoint. В случае с YDB CLI перезаписывается опцией --iam-endpoint . |
опциональное |
Описание полей creds_json (JWT) |
|||
type |
string | Тип источника токена. Нужно задать константу JWT |
|
alg |
string | Алгоритм подписи JWT. Поддерживаются следующие алгоритмы: ES256, ES384, ES512, HS256, HS384, HS512, PS256, PS384, PS512, RS256, RS384, RS512 | |
private-key |
string | (Приватный) ключ в формате PEM (для алгоритмов ES* , PS* , RS* ) или Base64 (для алгоритмов HS* ) для подписи |
|
kid |
string | Стандартное поле JWT kid (key id) |
опциональное |
iss |
string | Стандартное поле JWT iss (issuer) |
опциональное |
sub |
string | Стандартное поле JWT sub (subject) |
опциональное |
aud |
string | Стандартное поле JWT aud (audience) |
опциональное |
jti |
string | Стандартное поле JWT jti (JWT id) |
опциональное |
ttl |
string | Время жизни JWT токена | 1h |
Описание полей creds_json (FIXED) |
|||
type |
string | Тип источника токена. Нужно задать константу FIXED |
|
token |
string | Значение токена | |
token-type |
string | Значение типа токена. Это значение попадёт в параметр subject_token_type/actor_token_type в запросе обмена токена |
Пример
Пример для обмена JWT токена
{
"subject-credentials": {
"type": "JWT",
"alg": "RS256",
"private-key": "-----BEGIN RSA PRIVATE KEY-----\n...-----END RSA PRIVATE KEY-----\n",
"kid": "my_key_id",
"sub": "account_id"
}
}
Особенности YDB Python SDK v2 (устаревшая версия)
Важно
Поведение YDB Python SDK v2 (устаревшая версия) отличается от описанного выше.
-
Алгоритм работы функции
construct_credentials_from_environ()
YDB Python SDK v2:- Если задано значение переменной окружения
USE_METADATA_CREDENTIALS
, равное 1, то используется режим аутентификации Metadata - Иначе, если задано значение переменной окружения
YDB_TOKEN
, то используется режим аутентификации Access Token, в который передается значение данной переменной - Иначе, если задано значение переменной окружения
SA_KEY_FILE
, то используется режим аутентификации System Account Key, а ключ загружается из файла, имя которого указано в данной переменной - Иначе в запросах не будет добавлена информация об аутентификации.
- Если задано значение переменной окружения
-
В случае, если при инициализации драйвера не передан никакой объект, отвечающий за генерацию токенов, то применяется общий порядок чтения значений переменных окружения.