add refresh token
This commit is contained in:
parent
22b6fd272f
commit
ef49ab8c6e
@ -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('''
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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}"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -33,6 +33,7 @@
|
|||||||
"Загрузка...": "Загрузка...",
|
"Загрузка...": "Загрузка...",
|
||||||
"Доступ запрещен": "Доступ запрещен",
|
"Доступ запрещен": "Доступ запрещен",
|
||||||
|
|
||||||
|
"Токен недействителен или истек": "Токен недействителен или истек",
|
||||||
"Ошибка предзагрузки": "Ошибка предзагрузки",
|
"Ошибка предзагрузки": "Ошибка предзагрузки",
|
||||||
"Unknown error": "Неизвестная ошибка",
|
"Unknown error": "Неизвестная ошибка",
|
||||||
"Refresh token is invalid or expired": "Токен обновления недействителен или просрочен",
|
"Refresh token is invalid or expired": "Токен обновления недействителен или просрочен",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user