Перейти к основному содержимому
Версия: 7.0

Авторизация и работа с токенами

Python-коннектор поддерживает работу с передаваемыми токенами:

  • Возможность сохранять и повторно использовать уже прописанные токены;
  • При истечении срока действия ACCESS_TOKEN автоматически выполняется обновление токена (если указан REFRESH_TOKEN).

Автоматическая ротация токенов

Для включения автоматической ротации токенов необходимо указать параметр auto_refresh=True при создании экземпляра класса PassworkClient. В этом режиме, если API возвращает ошибку accessTokenExpired, коннектор автоматически вызывает обновление токенов и повторяет запрос без необходимости ручного вмешательства.

update_tokens

Функция выполняет обновление accessToken с использованием ранее выданного refreshToken. Не принимает аргументы, работает с текущим состоянием экземпляра PassworkClient.

Выполняемые действия:

  • Выполняет ротацию accessToken и refreshToken через API запрос;
  • Обновляет соответствующие поля в экземпляре клиента;
  • Если токены были сохранены в файл (через save_session), автоматически обновляет сохранённые значения.

Мы рекомендуем использовать автоматическую ротацию токенов совместно с сохранением токенов (и мастер-ключа) в отдельный файл.

Сохранение и получение токенов

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

Для работы с сохранением и загрузкой токенов предусмотрены функции:

  • save_session
  • load_session

save_session

Функция предназначена для сохранения токенов и (опционально) мастер-ключа из экземпляра класса PassworkClient.

Параметры:

  • file_path — путь и имя файла, в котором будут храниться зашифрованные данные. Пример: "/opt/access/api_passwork_tokens";
  • encryption_key — ключ шифрования:
    • при первом использовании рекомендуется передавать None — коннектор автоматически сгенерирует ключ и зашифрует данные;
    • при последующих вызовах необходимо передавать ранее сгенерированный ключ.
  • save_master_key — флаг, определяющий, нужно ли сохранять и шифровать в файл мастер-ключ пользователя вместе с токенами.

load_session

Функция предназначена для загрузки сохранённых токенов и (опционально) мастер-ключа из зашифрованного файла.

Параметры:

  • file_path — путь и имя файла, из которого будут загружены зашифрованные данные;
  • encryption_key — ключ шифрования, который использовался при сохранении токенов и (опционально) мастер-ключа.

Базовый пример

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

Импортировать токены и (опционально) мастер-ключ:

export PASSWORK_TOKEN="AyyR+yWe27xoPMd3502YmcyLR7j/+8dZnXYFvdn+w1o="
export PASSWORK_REFRESH_TOKEN="cF1krXop6sUoDrbGTt0dNRtOrvCG3uK98/vtVCjZRJY="
export PASSWORK_MASTER_KEY="EgOHwWQZcsgp/hFUAXS0PD60IUjxinfUEo8kUomhloumAXsRPtZ/7wTubtT7WXSpbfvKDDlm+yeOt5l5mN++IQ=="

Создать файл create_vault.py и поместить следующее:

import os
from passwork_client import PassworkClient
from passwork_client.exceptions import PassworkError

passwork = PassworkClient(host="https://passwork.example.com", verify_ssl=True, auto_refresh=True) # Или PassworkClient(host="https://passwork.example.com", True, True)
passwork.set_tokens(os.getenv("PASSWORK_TOKEN"), os.getenv("PASSWORK_REFRESH_TOKEN"))
passwork.set_master_key(os.getenv("PASSWORK_MASTER_KEY"))

# Загрузка токенов из зашифрованного файла
# passwork.load_session("/opt/access/api_passwork_tokens", "ключ_шифрования")
# Закомментировать при первом запуске автоматизации так как зашифрованный файл ещё не создан

vault_name = "DevOps"
company_vault_type = passwork.find_vault_type(name="DevOps")
vault_id = passwork.create_vault(vault_name, company_vault_type["id"])
print(f"Vault was created: {vault_id}")

# Сохранение токенов в зашифрованном файле
encryption_key = passwork.save_session("/opt/access/api_passwork_tokens", encryption_key=None, save_master_key=True) # Или passwork.save_session("path", None, True)
# В encryption_key не указывать значение, будет сгенерирован ключ шифрования

# Получить случайно сгенерированный ключ шифрования
print(f"Encryption key: {encryption_key}")

Сохранить файл и запустить:

python3 create_vault.py

Пример корректного вывода:

Encryption key: bjteL538FXzL2GSIO7qCTt5kOujpYrBVX9bCgzdnC+A=
Vault was created: 68dbc69a6e6ccb8154015b72

Отредактировать скрипт create_vault.py:

  • Закомментировать/Удалить передачу токенов и (опционально) мастер-ключа;
  • Раскомментировать получение токенов и (опционально) мастер-ключа из зашифрованного файла с помощью ключа шифрования.
import os
from passwork_client import PassworkClient
from passwork_client.exceptions import PassworkError

passwork = PassworkClient("https://passwork.example.com", True, True)

# Загрузка токенов из зашифрованного файла
passwork.load_session("/opt/access/api_passwork_tokens", "bjteL538FXzL2GSIO7qCTt5kOujpYrBVX9bCgzdnC+A=")
# Закомментировать при первом запуске автоматизации так как зашифрованный файл ещё не создан

vault_name = "DevOps"
company_vault_type = passwork.find_vault_type(name="DevOps")
vault_id = passwork.create_vault(vault_name, company_vault_type["id"])
print(f"Vault was created: {vault_id}")

# Сохранение токенов в зашифрованном файле
passwork.save_session("/opt/access/api_passwork_tokens", "bjteL538FXzL2GSIO7qCTt5kOujpYrBVX9bCgzdnC+A=", True)
# В encryption_key не указывать значение, будет сгенерирован ключ шифрования

Чтобы не хранить ключ шифрования для расшифровки токенов в файле, его можно передавать в Python-скрипт одним из следующих способов:

  • Переменные окружения (ENV) — задание ключа через окружение и последующее чтение с помощью os.environ.
  • Аргументы командной строки (argparse) — передача ключа при запуске скрипта с разбором аргументов.
  • Стандартный ввод (STDIN, pipe или here-doc) — ключ считывается из входного потока, не попадая в список аргументов процесса.
  • Интерактивный ввод (getpass) — безопасный запрос ключа у пользователя в момент выполнения (символы не отображаются на экране).