documentation/pages/python_access.md
2025-06-03 15:04:26 +03:00

5.8 KiB
Raw Blame History

Доступ к API через запросы на Python

API платформы позволяют использовать basic и OIDC авторизацию.

Использование OIDC авторизации

OIDC - это механизм предоставления доступов к одному сервису при наличии учетной записи в другом сервисе.

Для OIDC авторизации на платформе необходимо наличие учетной записи в KeyCloak. Сначала необходимо получить токен от KeyCloak (см. ниже). Затем полученный токен можно использовать в запросах.

from requests import post

with open('input.json') as f:
    data = json.load(f)

res = post(self.test_url, headers={"Authorization": f"Bearer {TOKEN}"}, json=data, allow_redirects=False)

Замечание. Если не использовать флаг allow_redirects=False, при ошибке авторизации будет возвращаться код 200 и страница авторизации KeyCloak.

Получение токена

Для этого можно воспользоваться следующим кодом. Используйте свои логин USER и пароль PASSWORD. Помимо токена, сохраните токен для обновления (refresh_token).

Напоминание: не храните логины и пароли в исполняемом коде. Используйте для этого переменные окружения! Можете обратиться к разделу со справкой


import subprocess

res = subprocess.run(["curl", "-X", "POST",
                  "https://platform-sso.stratpro.hse.ru/realms/platform.stratpro.hse.ru/protocol/openid-connect/token",
                  "--data-urlencode", f'client_id=end-users',
                  "--data-urlencode", 'grant_type=password',
                  "--data-urlencode", f'username={USER}',
                  "--data-urlencode", f'password={PASSWORD}'], capture_output=True)
token = json.loads(res.stdout)['access_token']
refresh_token = json.loads(res.stdout)['refresh_token']

Можно использовать равноценную bash-команду.


curl -X POST https://platform-sso.stratpro.hse.ru/realms/platform.stratpro.hse.ru/protocol/openid-connect/token --data-urlencode client_id=end-users --data-urlencode grant_type=password --data-urlencode username=USER --data-urlencode password=PASSWORD

Обновление токена

Если срок действия токена истёк, его можно обновить, используя полученный ранее refresh_token, или получить новый токен. Для обновления воспользуйтесь следующим кодом


import subprocess

res = subprocess.run(["curl", "-X", "POST",
                  "https://platform-sso.stratpro.hse.ru/realms/platform.stratpro.hse.ru/protocol/openid-connect/token",
                  "--data-urlencode", f'client_id=end-users',
                  "--data-urlencode", 'grant_type=refresh_token',
                  "--data-urlencode", f'refresh_token={refresh_token}'],
                  capture_output=True)
token = json.loads(res.stdout)['access_token']

Можно использовать равноценную bash-команду.


curl -X POST https://platform-sso.stratpro.hse.ru/realms/platform.stratpro.hse.ru/protocol/openid-connect/token --data-urlencode client_id=end-users --data-urlencode grant_type=refresh_token --data-urlencode refresh_token=REFRESH_TOKEN

Использование basic авторизации

Замечание. Сервис, к которому обращаются, должен позволять использование basic-авторизации. В противном случае используйте OIDC.

Для basic авторизации необходимы логин и пароль, которые вам может предоставить только администратор. Для запроса достаточно передать логин USER и пароль PASSWORD в параметры запроса.


from requests import post

with open('input.json') as f:
    data = json.load(f)

res = post(f'{test_url}/{app_name}/pipelines/{pipeline_name}/trials',
           auth=HTTPBasicAuth(USER, PASSWORD), json=data)

Также возможна авторизация с использованием токена базовой авторизации. Это строка в кодировке base64, содержащая имя пользователя и пароль.

from requests import request
# ещё один метод для отправки запросов

res = request("POST", f"{test_url}/{app}/files/{box}/{filename}",
              data="", headers={"Authorization": f"Basic {BASIC_TOKEN}"})

Загрузка переменных окружения

Один из доступных вариантов - использование библиотеки dotenv. Переменные окружения хранятся в файле .env

Напоминание: не храните файл .env в репозитории! Чтобы случайно не добавить его, проверьте, что он указан в файле .gitignore

# файл .env

TEST_DATA_COMPONENT_URL=https://platform.stratpro.hse.ru
from dotenv import load_dotenv

load_dotenv()

TEST_URL = os.getenv('TEST_DATA_COMPONENT_URL')