2025-06-02 13:14:41 +00:00
# Доступ к API через запросы на Python
2025-06-03 11:53:29 +00:00
API платформы позволяют использовать basic и OIDC авторизацию.
2025-06-02 13:14:41 +00:00
2025-06-03 11:53:29 +00:00
## Использование OIDC авторизации
OIDC - это механизм предоставления доступов к одному сервису при наличии учетной записи в другом сервисе.
Для OIDC авторизации на платформе необходимо наличие учетной записи в KeyCloak. Сначала необходимо получить `токен` от KeyCloak (см. ниже). Затем полученный токен можно использовать в запросах.
2025-06-02 13:14:41 +00:00
```
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)
```
2025-06-03 11:53:29 +00:00
**Замечание**. Если не использовать флаг `allow_redirects=False` , при ошибке авторизации будет возвращаться код 200 и страница авторизации KeyCloak.
2025-06-02 13:14:41 +00:00
### Получение токена
2025-06-03 12:03:19 +00:00
Для этого можно воспользоваться следующим кодом. Используйте свои логин `USER` и пароль `PASSWORD` . Помимо токена, сохраните токен для обновления (`refresh_token`).
**Напоминание: не храните логины и пароли в исполняемом коде. Используйте для этого переменные окружения!** Можете обратиться к разделу [с о справкой ](#загрузка-переменных-окружения )
2025-06-02 13:14:41 +00:00
```python
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-команду.
```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
```
### Обновление токена
2025-06-03 11:53:29 +00:00
Если срок действия токена истёк, е г о можно обновить, используя полученный ранее `refresh_token` , или получить новый токен. Для обновления воспользуйтесь следующим кодом
2025-06-02 13:14:41 +00:00
```python
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-команду.
```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
```
2025-06-03 11:53:29 +00:00
## Использование basic авторизации
2025-06-02 13:14:41 +00:00
2025-06-03 11:53:29 +00:00
**Замечание**. Сервис, к которому обращаются, должен позволять использование basic-авторизации. В противном случае используйте OIDC.
2025-06-02 13:14:41 +00:00
2025-06-03 11:53:29 +00:00
Для basic авторизации необходимы логин и пароль, которые вам может предоставить только администратор.
2025-06-02 13:14:41 +00:00
Для запроса достаточно передать логин `USER` и пароль `PASSWORD` в параметры запроса.
```python
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, содержащая имя пользователя и пароль.
```python
from requests import request
# ещё один метод для отправки запросов
res = request("POST", f"{test_url}/{app}/files/{box}/{filename}",
data="", headers={"Authorization": f"Basic {BASIC_TOKEN}"})
```
2025-06-03 12:03:19 +00:00
## Загрузка переменных окружения
Один из доступных вариантов - использование библиотеки dotenv. Переменные окружения хранятся в файле .env
2025-06-03 12:04:26 +00:00
2025-06-03 12:03:19 +00:00
**Напоминание: не храните файл .env в репозитории!** Чтобы случайно не добавить е г о , проверьте, что он указан в файле .gitignore
```
# файл .env
TEST_DATA_COMPONENT_URL=https://platform.stratpro.hse.ru
```
```python
from dotenv import load_dotenv
load_dotenv()
TEST_URL = os.getenv('TEST_DATA_COMPONENT_URL')
```