Перейти к содержанию

Аутентификация с помощью API-ключей

Все запросы к REST API платформы PWS должны быть аутентифицированы. Для этого используются статические API-ключи, которые передаются в заголовке Authorization каждого запроса в формате Bearer-токена.


Пошаговое руководство

Процесс получения доступа к API состоит из двух шагов: сначала вы создаете сервисный аккаунт, а затем получаете для него API-ключ.

Перед началом

Убедитесь, что в проекте создано приложение с экземпляром — сервисный аккаунт привязывается к конкретному экземпляру.

Шаг 1: Создайте сервисный аккаунт

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

  1. В навигационном меню проекта перейдите в раздел Сервисные аккаунты.
  2. Нажмите Создать аккаунт.
  3. Заполните основные данные:
    • Название — понятное имя для идентификации аккаунта
    • Описание — опционально, для пояснения назначения
  4. Настройте доступы:
    • Экземпляр приложения — определяет, к какому экземпляру и окружению будет иметь доступ аккаунт. Его невозможно изменить после создания.
    • Уровень доступа — выберите одну или несколько ролей. Роли можно изменить позже.
  5. Нажмите Создать.

Создание сервисного аккаунта

Форма создания сервисного аккаунта с выбором экземпляра и ролей.

Шаг 2: Получите и сохраните API-ключ

При создании сервисного аккаунта для него автоматически генерируется первый API-ключ. Он отображается в модальном окне сразу после создания аккаунта.

Скопируйте и сохраните ваш ключ немедленно

Секретная часть API-ключа (Секретный ключ) отображается только один раз. Обязательно скопируйте и сохраните его в надежном месте. Платформа не хранит его в открытом виде, и посмотреть его снова будет невозможно.

Окно с созданным API-ключом

Окно с вашим первым API-ключом.

Использование ключа в запросах

Для аутентификации передавайте ваш Секретный ключ в заголовке Authorization с префиксом Bearer.

curl --request POST \
  --url https://<DOMAIN>/v1/configs \
  --header "Authorization: Bearer <YOUR_API_KEY>" \
  --header "Content-Type: application/json"
import requests

api_key = "YOUR_API_KEY"
url = "https://<DOMAIN>/v1/configs"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}

response = requests.post(url, headers=headers)

print(response.json())
const fetch = require('node-fetch'); // Для Node.js

const apiKey = 'YOUR_API_KEY';
const url = 'https://<DOMAIN>/v1/configs';

const headers = {
    'Authorization': `Bearer ${apiKey}`,
    'Content-Type': 'application/json'
};

fetch(url, { method: 'POST', headers: headers })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(err => console.error('error:' + err));
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class ApiClient
{
    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var url = "https://<DOMAIN>/v1/configs";

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = 
                new AuthenticationHeaderValue("Bearer", apiKey);

            var response = await client.PostAsync(url, null);

            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content);
            }
        }
    }
}
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    apiKey := "YOUR_API_KEY"
    url := "https://<DOMAIN>/v1/configs"

    req, err := http.NewRequest("POST", url, nil)
    if err != nil {
        log.Fatalf("Ошибка при создании запроса: %v", err)
    }

    req.Header.Set("Authorization", "Bearer "+apiKey)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalf("Ошибка при выполнении запроса: %v", err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Ошибка при чтении ответа: %v", err)
    }

    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ApiClient {
    public static void main(String[] args) throws Exception {
        String apiKey = "YOUR_API_KEY";
        String url = "https://<DOMAIN>/v1/configs";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Authorization", "Bearer " + apiKey)
                .POST(HttpRequest.BodyPublishers.noBody())
                .build();

        HttpResponse<String> response = 
            client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}

Не забудьте заменить плейсхолдеры

В примерах выше замените <YOUR_API_KEY> на ваш реальный Секретный ключ.

В параметре <DOMAIN> указывается адрес вашего сервера. В зависимости от типа вашей установки, это может быть:

  • On-premises / Private Cloud: ваш корпоративный домен
  • SaaS: версия в разработке (домен будет предоставлен после выпуска)

Управление ключами и безопасность

Правильное управление API-ключами — критически важный аспект безопасности вашего приложения.

Хранение ключей

Никогда не храните API-ключи в открытом виде в коде или системе контроля версий. Используйте безопасные методы:

  • Переменные окружения на вашем сервере.
  • Системы управления секретами (например, HashiCorp Vault, AWS Secrets Manager).

Ротация ключей

Для минимизации рисков рекомендуется периодически проводить ротацию ключей. Процесс состоит из следующих шагов:

  1. Создайте новый API-ключ. Для этого:
    • На странице Сервисные аккаунты выберите нужный аккаунт.
    • Нажмите на иконку редактирования рядом с названием аккаунта.
    • Перейдите на вкладку API-ключи и нажмите Создать API-ключ.
    • Дайте ключу осмысленное Описание и не забудьте скопировать Секретный ключ.
  2. Обновите ваше приложение, чтобы они использовали новый ключ.
  3. Убедитесь, что все сервисы работают стабильно с новым ключом.
  4. Удалите старый ключ в интерфейсе платформы, чтобы он больше не мог быть использован.

Принцип наименьших привилегий

Один сервис — один сервисный аккаунт

Для максимальной изоляции и безопасности мы настоятельно рекомендуем создавать отдельный сервисный аккаунт для каждого сервиса или приложения.

Это позволяет:

  • Изолировать доступ: Отзывать и ротировать ключи для одного сервиса, не затрагивая работу остальных.
  • Гибко управлять правами: Назначать разные роли разным сервисным аккаунтам.
  • Упростить аудит: Легко отслеживать, от какого сервиса приходят запросы.