57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
import json
|
||
import os
|
||
import urllib.error
|
||
import urllib.request
|
||
from typing import Optional
|
||
|
||
|
||
DEFAULT_USERNAME = "+79214400842"
|
||
DEFAULT_PASSWORD = "stepan"
|
||
DEFAULT_GRANT_TYPE = "password"
|
||
|
||
|
||
def get_access_token(
|
||
auth_url: Optional[str] = None,
|
||
*,
|
||
username: str = DEFAULT_USERNAME,
|
||
password: str = DEFAULT_PASSWORD,
|
||
grant_type: str = DEFAULT_GRANT_TYPE,
|
||
timeout_s: int = 30,
|
||
) -> str:
|
||
"""
|
||
POST авторизация, возвращает access_token.
|
||
|
||
Можно переопределить AUTH_URL через env.
|
||
"""
|
||
auth_url = auth_url or os.getenv("AUTH_URL") or "https://auth.dev.dipal.ru/api/v1/auth/login"
|
||
if not auth_url:
|
||
raise ValueError("Не задан AUTH_URL (передайте auth_url или установите env AUTH_URL)")
|
||
|
||
payload = {"username": username, "password": password, "grant_type": grant_type}
|
||
req = urllib.request.Request(
|
||
auth_url,
|
||
data=json.dumps(payload).encode("utf-8"),
|
||
headers={"content-type": "application/json"},
|
||
method="POST",
|
||
)
|
||
try:
|
||
with urllib.request.urlopen(req, timeout=timeout_s) as resp:
|
||
raw = resp.read().decode("utf-8")
|
||
except urllib.error.HTTPError as e:
|
||
body = e.read().decode("utf-8", errors="replace")
|
||
raise RuntimeError(f"Auth HTTP {e.code}: {body}") from e
|
||
|
||
data = json.loads(raw) if raw else {}
|
||
if "data" in data and isinstance(data["data"], dict):
|
||
token = data["data"].get("access_token")
|
||
else:
|
||
token = data.get("access_token")
|
||
if not token:
|
||
raise ValueError(f"В ответе нет access_token. Ключи ответа: {list(data.keys())}")
|
||
return token
|
||
|
||
|
||
if __name__ == "__main__":
|
||
print(get_access_token())
|
||
|