diff --git a/backend/app/admin/schema/token.py b/backend/app/admin/schema/token.py index efd0c768..61244e59 100644 --- a/backend/app/admin/schema/token.py +++ b/backend/app/admin/schema/token.py @@ -18,14 +18,11 @@ class AccessTokenBase(SchemaBase): access_token_expire_time: datetime -class GetLoginToken(AccessTokenBase): +class GetNewToken(AccessTokenBase): refresh_token: str refresh_token_type: str = 'Bearer' refresh_token_expire_time: datetime - user: GetUserInfoNoRelationDetail -class GetNewToken(AccessTokenBase): - refresh_token: str - refresh_token_type: str = 'Bearer' - refresh_token_expire_time: datetime +class GetLoginToken(GetNewToken): + user: GetUserInfoNoRelationDetail diff --git a/backend/app/admin/service/auth_service.py b/backend/app/admin/service/auth_service.py index 59e78afd..5c49c1f2 100644 --- a/backend/app/admin/service/auth_service.py +++ b/backend/app/admin/service/auth_service.py @@ -62,7 +62,9 @@ async def login(*, request: Request, obj: AuthLoginParam, background_tasks: Back str(current_user.id), multi_login=current_user.is_multi_login ) refresh_token, refresh_token_expire_time = await create_refresh_token( - str(current_user.id), access_token_expire_time, multi_login=current_user.is_multi_login + str(current_user.id), + access_token_expire_time, + multi_login=current_user.is_multi_login, ) await user_dao.update_login_time(db, obj.username) await db.refresh(current_user) @@ -113,19 +115,17 @@ async def new_token(*, request: Request, refresh_token: str) -> GetNewToken: elif not current_user.status: raise errors.AuthorizationError(msg='用户已锁定,操作失败') current_token = await get_token(request) - ( - new_access_token, - new_refresh_token, - new_access_token_expire_time, - new_refresh_token_expire_time, - ) = await create_new_token( - str(current_user.id), current_token, refresh_token, multi_login=current_user.is_multi_login + new_token = await create_new_token( + str(current_user.id), + current_token, + refresh_token, + multi_login=current_user.is_multi_login, ) data = GetNewToken( - access_token=new_access_token, - access_token_expire_time=new_access_token_expire_time, - refresh_token=new_refresh_token, - refresh_token_expire_time=new_refresh_token_expire_time, + access_token=new_token.new_access_token, + access_token_expire_time=new_token.new_access_token_expire_time, + refresh_token=new_token.new_refresh_token, + refresh_token_expire_time=new_token.new_refresh_token_expire_time, ) return data diff --git a/backend/common/dataclasses.py b/backend/common/dataclasses.py index 1643cf31..aeaca534 100644 --- a/backend/common/dataclasses.py +++ b/backend/common/dataclasses.py @@ -2,6 +2,8 @@ # -*- coding: utf-8 -*- import dataclasses +from datetime import datetime + from fastapi import Response from backend.common.enums import StatusType @@ -30,3 +32,11 @@ class RequestCallNextReturn: status: StatusType err: Exception | None response: Response + + +@dataclasses.dataclass +class NewTokenReturn: + new_access_token: str + new_refresh_token: str + new_access_token_expire_time: datetime + new_refresh_token_expire_time: datetime diff --git a/backend/common/security/jwt.py b/backend/common/security/jwt.py index dfb224eb..c4f974dc 100644 --- a/backend/common/security/jwt.py +++ b/backend/common/security/jwt.py @@ -11,6 +11,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from backend.app.admin.model import User +from backend.common.dataclasses import NewTokenReturn from backend.common.exception.errors import AuthorizationError, TokenError from backend.core.conf import settings from backend.database.db_redis import redis_client @@ -100,7 +101,7 @@ async def create_refresh_token(sub: str, expire_time: datetime | None = None, ** return refresh_token, expire -async def create_new_token(sub: str, token: str, refresh_token: str, **kwargs) -> tuple[str, str, datetime, datetime]: +async def create_new_token(sub: str, token: str, refresh_token: str, **kwargs) -> NewTokenReturn: """ Generate new token @@ -118,7 +119,12 @@ async def create_new_token(sub: str, token: str, refresh_token: str, **kwargs) - refresh_token_key = f'{settings.TOKEN_REDIS_PREFIX}:{sub}:{refresh_token}' await redis_client.delete(token_key) await redis_client.delete(refresh_token_key) - return new_access_token, new_refresh_token, new_access_token_expire_time, new_refresh_token_expire_time + return NewTokenReturn( + new_access_token=new_access_token, + new_refresh_token=new_refresh_token, + new_access_token_expire_time=new_access_token_expire_time, + new_refresh_token_expire_time=new_refresh_token_expire_time, + ) @sync_to_async