Аутентификация в 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 ) |
Определяется по переменным окружения | ydb.construct_credentials_from_environ() |
Режим | Пакет | Метод |
---|---|---|
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) |
Определяется по переменным окружения | 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); |
Определяется по переменным окружения | 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 | не поддерживается |
Определяется по переменным окружения | не поддерживается |
Выполнение внешней команды | ydb.CommandLineYcToken (например, для авторизации с помощью IAM-токена Yandex.Cloud с компьютера разработчика ydb::CommandLineYcToken.from_cmd("yc iam create-token") ) |
Порядок определения режима и параметров аутентификации из окружения
Выполняется следующий алгоритм, одинаковый для всех 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, в который передается значение данной переменной - Иначе используется режим аутентификации Metadata
Наличие последним пунктом алгоритма выбора режима Metadata позволяет развернуть рабочее приложение на виртуальных машинах и в Cloud Functions Yandex.Cloud без задания каких-либо переменных окружения.
Особенности Python SDK
Важно
Поведение Python SDK отличается от описанного выше.
- Алгоритм определения режима аутентификации и необходимых параметров из переменных окружения в методе
construct_credentials_from_environ()
отличается от применяемого в других SDK:- Если задано значение переменной окружения
USE_METADATA_CREDENTIALS
, равное 1, то используется режим аутентификации Metadata - Иначе, если задано значение переменной окружения
YDB_TOKEN
, то используется режим аутентификации Access Token, в который передается значение данной переменной - Иначе, если задано значение переменной окружения
SA_KEY_FILE
, то используется режим аутентификации System Account Key, а ключ загружается из файла, имя которого указано в данной переменной - Иначе в запросах не будет добавлена информация об аутентификации.
- Если задано значение переменной окружения
- В случае, если при инициализации драйвера не передан никакой объект, отвечающий за генерацию токенов, то применяется общий порядок чтения значений переменных окружения.