Получение IAM-токена для сервисного аккаунта Yandex API (Yandex Cloud, Yandex SpeechKit, Yandex AI)
Есть несколько способов получить IAM-токен для сервисного аккаунта:
- С помощью CLI — самый простой способ.
- С помощью JSON Web Token. Этот способ подойдет для автоматизации работы через API.
- С помощью виртуальной машины в сервисе Compute Cloud. Этот способ удобен, если ваше приложение запущено на виртуальной машине Yandex Cloud.
- С помощью функции в сервисе Cloud Functions. Этот способ подойдет для получения IAM-токена из кода вашей функции.
Время жизни IAM-токена — не больше 12 часов, но рекомендуется запрашивать его чаще, например каждый час.
Получить IAM-токен с помощью CLI
Настройте CLI для работы от имени сервисного аккаунта:
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
Создайте авторизованный ключ для вашего сервисного аккаунта и запишите его в файл:
yc iam key create --service-account-name my-robot --output key.json
Если вы получили ошибку ERROR: service account with name "my-robot" not found
, значит в каталоге по умолчанию нет сервисного аккаунта с таким именем. Если имя правильное, то выполните одну из команд:
- Укажите каталог с сервисным аккаунтом с помощью параметра
--folder-name
или--folder-id
:yc iam key create --folder-name my-folder --service-account-name my-robot --output key.json
- Укажите сервисный аккаунт по идентификатору с помощью параметра
--service-account-id
:yc iam key create --service-account-id b1gnbfd11bq5******** --output key.json
- Создайте профиль, который будет использоваться для выполнения операций от имени сервисного аккаунта:
yc config profile create my-robot-profile
- Укажите в конфигурации профиля авторизованный ключ сервисного аккаунта:
yc config set service-account-key key.json
Теперь вы можете получить IAM-токен для сервисного аккаунта:
yc iam create-token
Полученный IAM-токен указывайте при обращении к ресурсам Yandex Cloud через API. Передайте IAM-токен в заголовке Authorization
в следующем формате:
Authorization: Bearer <IAM-токен>
Получить IAM-токен с помощью JWT
- NET 5.0+:
using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using Jose; namespace ConsoleApp { class Program { static void Main(string[] args) { var serviceAccountId = "<идентификатор_сервисного_аккаунта>"; var keyId = "<идентификатор_открытого_ключа>"; var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); var headers = new Dictionary
() { { "kid", keyId } }; var payload = new Dictionary () { { "aud", "https://iam.api.cloud.yandex.net/iam/v1/tokens" }, { "iss", serviceAccountId }, { "iat", now }, { "exp", now + 3600 } }; using (var rsa = RSA.Create()) { rsa.ImportFromPem(File.ReadAllText("<файл_закрытого_ключа>").ToCharArray()); string encodedToken = Jose.JWT.Encode(payload, rsa, JwsAlgorithm.PS256, headers); } } } }
var serviceAccountId = "<идентификатор_сервисного_аккаунта>";
var keyId = "<идентификатор_открытого_ключа>";
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
var headers = new Dictionary()
{
{ "kid", keyId }
};
var payload = new Dictionary()
{
{ "aud", "https://iam.api.cloud.yandex.net/iam/v1/tokens" },
{ "iss", serviceAccountId },
{ "iat", now },
{ "exp", now + 3600 }
};
using (var rsa = RSA.Create())
{
rsa.ImportFromPem(File.ReadAllText("d:\\Downloads\\PRIVATE-KEY-for-iam-ai-yandex.txt").ToCharArray());
encodedToken = Jose.JWT.Encode(payload, rsa, JwsAlgorithm.PS256, headers);
}
using (var client = new HttpClient())
{
var content = new StringContent($"{{\"jwt\": \"{encodedToken}\"}}", Encoding.UTF8, "application/json");
var res = client.PostAsync(payload["aud"].ToString(), content).Result;
if (res.StatusCode == HttpStatusCode.OK)
{
iam = res.Content.ReadFromJsonAsync<IamTokenInfo>().Result;
}
}
public class IamTokenInfo
{
public string? IamToken { get; set; }
public string? ExpiresAt { get; set; }
}
2.Обменять JWT на IAM-токен
Когда вы обмениваете JWT на IAM-токен, необходимо соблюсти условия:
- Указанные в JWT сервисный аккаунт и ключ существуют (не удалены).
- Ключ принадлежит сервисному аккаунту.
- Подпись верна.
Чтобы получить IAM-токен, воспользуйтесь методом REST API create для ресурса IamToken или вызовом gRPC API IamTokenService/CreateForServiceAccount.
Пример запроса с помощью cURL для метода REST API create
:
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"jwt": "<JWT-токен>"}' \
https://iam.api.cloud.yandex.net/iam/v1/tokens
Где <JWT-токен>
— токен в формате JWT, полученный на предыдущем шаге.
Полученный IAM-токен указывайте при обращении к ресурсам Yandex Cloud через API. Передайте IAM-токен в заголовке Authorization
в следующем формате:
Authorization: Bearer <IAM-токен>
Источник:
- https://cloud.yandex.ru/ru/docs/iam/operations/iam-token/create-for-sa
- https://cloud.yandex.ru/ru/docs/iam/operations/sa/get-id
- https://cloud.yandex.ru/ru/docs/iam/api-ref/grpc/iam_token_service#CreateForServiceAccount
- https://cloud.yandex.ru/ru/docs/iam/api-ref/IamToken/
- https://cloud.yandex.ru/ru/docs/iam/api-ref/IamToken/create