НаукаТехнологии

Получение IAM-токена для сервисного аккаунта Yandex API (Yandex Cloud, Yandex SpeechKit, Yandex AI)

Есть несколько способов получить IAM-токен для сервисного аккаунта:

  1. С помощью CLI — самый простой способ.
  2. С помощью JSON Web Token. Этот способ подойдет для автоматизации работы через API.
  3. С помощью виртуальной машины в сервисе Compute Cloud. Этот способ удобен, если ваше приложение запущено на виртуальной машине Yandex Cloud.
  4. С помощью функции в сервисе 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
  1. Создайте профиль, который будет использоваться для выполнения операций от имени сервисного аккаунта:
    yc config profile create my-robot-profile
  2. Укажите в конфигурации профиля авторизованный ключ сервисного аккаунта:
    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-токен>

Источник:

What's your reaction?

Excited
0
Happy
0
In Love
0
Not Sure
0
Silly
0

You may also like

More in:Наука

Leave a reply