# Доступ к 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}"}) ``` ## Загрузка переменных окружения Один из доступных вариантов - использование библиотеки dotenv. Переменные окружения хранятся в файле .env **Напоминание: не храните файл .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') ```