add refresh token

This commit is contained in:
unknown 2025-09-30 02:09:37 +03:00
parent 22b6fd272f
commit ef49ab8c6e
5 changed files with 38 additions and 28 deletions

View File

@ -51,20 +51,20 @@ def init_db():
conn.commit() conn.commit()
conn.close() conn.close()
def add_session(login, access_token, refresh_token, user_id=None, update_existing=False): def add_session(access_token, refresh_token,login=None, user_id=None, update_existing=False, old_access_token=None, old_refresh_token=None):
"""Добавляет новую сессию или обновляет существующую.""" """Добавляет новую сессию или обновляет существующую."""
conn = get_connection() conn = get_connection()
cursor = conn.cursor() cursor = conn.cursor()
print("ffff", login, access_token, refresh_token, user_id, update_existing) #print("ffff", login, access_token, refresh_token, user_id, update_existing)
if update_existing: if update_existing:
# Обновляем существующую сессию по access_token # Обновляем существующую сессию по access_token
cursor.execute(''' cursor.execute('''
UPDATE sessions UPDATE sessions
SET access_token = ?, refresh_token = ?, created_at = ? SET access_token = ?, refresh_token = ?
WHERE access_token = ? WHERE access_token = ? AND refresh_token = ?
''', (access_token, refresh_token, datetime.now(), access_token)) ''', (access_token, refresh_token, old_access_token, old_refresh_token))
else: else:
# Вставляем новую или заменяем существующую по логину # Вставляем новую или заменяем существующую по логину
cursor.execute(''' cursor.execute('''

View File

@ -40,21 +40,26 @@ async def authorized_get(
if resp.status_code != 401 or not login or not access_token: if resp.status_code != 401 or not login or not access_token:
return resp return resp
print("authorized_get 401")
# Try refresh flow lazily to avoid import cycle at import time # Try refresh flow lazily to avoid import cycle at import time
from app.core.database import get_session, logout from app.core.database import get_session, logout
from app.core.services.auth_service import refresh_token as do_refresh from app.core.services.auth_service import refresh_token as do_refresh
session = get_session(login) session = get_session(login)
if not session or not session.get("refresh_token"): if not session:
return resp
try:
refresh = session["refresh_token"]
except Exception:
refresh = session.get("refresh_token") if isinstance(session, dict) else None
if not refresh:
return resp return resp
ok, data = await do_refresh(access_token, session["refresh_token"]) ok, data = await do_refresh(access_token, refresh)
if ok: if ok:
new_access = data["access_token"] new_access = data["access_token"]
hdrs["Authorization"] = f"Bearer {new_access}" hdrs["Authorization"] = f"Bearer {new_access}"
return await get_client().get(url, headers=hdrs, params=params) return await get_client().get(url, headers=hdrs, params=params)
logout(access_token)
return resp return resp
async def authorized_post( async def authorized_post(
@ -75,18 +80,28 @@ async def authorized_post(
if resp.status_code != 401 or not login or not access_token: if resp.status_code != 401 or not login or not access_token:
return resp return resp
print("authorized_post 401")
from app.core.database import get_session, logout from app.core.database import get_session, logout
from app.core.services.auth_service import refresh_token as do_refresh from app.core.services.auth_service import refresh_token as do_refresh
session = get_session(login) session = get_session(login)
if not session or not session.get("refresh_token"): if not session:
return resp
try:
refresh = session["refresh_token"]
except Exception:
refresh = session.get("refresh_token") if isinstance(session, dict) else None
if not refresh:
return resp return resp
ok, data = await do_refresh(access_token, session["refresh_token"]) ok, data = await do_refresh(access_token, refresh)
if ok: if ok:
new_access = data["access_token"] new_access = data["access_token"]
hdrs["Authorization"] = f"Bearer {new_access}" hdrs["Authorization"] = f"Bearer {new_access}"
return await get_client().post(url, headers=hdrs, params=params, json=json, data=data) return await get_client().post(url, headers=hdrs, params=params, json=json, data=data)
logout(access_token)
return resp return resp

View File

@ -32,16 +32,7 @@ async def login(login, password):
return False, data.get("detail", localizer.translate("Неизвестная ошибка")) return False, data.get("detail", localizer.translate("Неизвестная ошибка"))
if response.status_code == 401: if response.status_code == 401:
error_data = response.json() return False, localizer.translate("Неверный логин или пароль")
return False, error_data.get("detail", localizer.translate("Неверный логин или пароль"))
if response.status_code == 403:
error_data = response.json()
return False, error_data.get("detail", localizer.translate("Доступ запрещен"))
if response.status_code == 422:
return False, localizer.translate("Некорректные входные данные")
return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}" return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}"
except httpx.RequestError as e: except httpx.RequestError as e:
@ -100,6 +91,7 @@ async def refresh_token(access_token: str, refresh_token: str):
""" """
url = f"{config.BASE_URL}/v1/auth/token/refresh" url = f"{config.BASE_URL}/v1/auth/token/refresh"
payload = {"access_token": access_token, "refresh_token": refresh_token} payload = {"access_token": access_token, "refresh_token": refresh_token}
print("payload", payload)
try: try:
response = await get_client().post(url, json=payload) response = await get_client().post(url, json=payload)
@ -109,7 +101,8 @@ async def refresh_token(access_token: str, refresh_token: str):
if data.get("status") == "fine": if data.get("status") == "fine":
token_data = data["data"] token_data = data["data"]
add_session( add_session(
login=None, old_access_token=access_token,
old_refresh_token=refresh_token,
access_token=token_data["access_token"], access_token=token_data["access_token"],
refresh_token=token_data["refresh_token"], refresh_token=token_data["refresh_token"],
update_existing=True, update_existing=True,
@ -118,8 +111,8 @@ async def refresh_token(access_token: str, refresh_token: str):
return False, data.get("detail", localizer.translate("Неизвестная ошибка")) return False, data.get("detail", localizer.translate("Неизвестная ошибка"))
if response.status_code == 401: if response.status_code == 401:
return False, localizer.translate("Refresh token недействителен или истек") print("response.status_code", response.json())
return False, localizer.translate("Токен недействителен или истек")
return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}" return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}"
except httpx.RequestError as e: except httpx.RequestError as e:
@ -143,8 +136,7 @@ async def get_user_role(access_token: str, login: str):
return (True, data['data']) if data.get("status") == "fine" else (False, data.get("detail", localizer.translate("Неизвестная ошибка"))) return (True, data['data']) if data.get("status") == "fine" else (False, data.get("detail", localizer.translate("Неизвестная ошибка")))
if response.status_code == 401: if response.status_code == 401:
return False, localizer.translate("Сессия истекла, войдите снова") return False, localizer.translate("?? ???????????")
return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}" return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}"
except httpx.RequestError as e: except httpx.RequestError as e:
@ -152,3 +144,4 @@ async def get_user_role(access_token: str, login: str):
except Exception as e: except Exception as e:
return False, f"{localizer.translate('Произошла ошибка')}: {e}" return False, f"{localizer.translate('Произошла ошибка')}: {e}"

View File

@ -33,6 +33,7 @@
"Загрузка...": "Loading...", "Загрузка...": "Loading...",
"Доступ запрещен": "Access denied", "Доступ запрещен": "Access denied",
"Токен недействителен или истек": "Хуй соси губой тряси",
"Ошибка предзагрузки": "Preload error", "Ошибка предзагрузки": "Preload error",
"Unknown error": "Unknown error", "Unknown error": "Unknown error",
"Refresh token is invalid or expired": "Refresh token is invalid or expired", "Refresh token is invalid or expired": "Refresh token is invalid or expired",

View File

@ -33,6 +33,7 @@
"Загрузка...": "Загрузка...", "Загрузка...": "Загрузка...",
"Доступ запрещен": "Доступ запрещен", "Доступ запрещен": "Доступ запрещен",
"Токен недействителен или истек": "Токен недействителен или истек",
"Ошибка предзагрузки": "Ошибка предзагрузки", "Ошибка предзагрузки": "Ошибка предзагрузки",
"Unknown error": "Неизвестная ошибка", "Unknown error": "Неизвестная ошибка",
"Refresh token is invalid or expired": "Токен обновления недействителен или просрочен", "Refresh token is invalid or expired": "Токен обновления недействителен или просрочен",