documentation/pages/python_access.md
2025-06-03 14:53:29 +03:00

98 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Доступ к 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`).
```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
```
### Обновление токена
Если срок действия токена истёк, его можно обновить, используя полученный ранее `refresh_token`, или получить новый токен. Для обновления воспользуйтесь следующим кодом
```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
```
## Использование basic авторизации
**Замечание**. Сервис, к которому обращаются, должен позволять использование basic-авторизации. В противном случае используйте OIDC.
Для basic авторизации необходимы логин и пароль, которые вам может предоставить только администратор.
Для запроса достаточно передать логин `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}"})
```