|
16 | 16 | from backend.app.crud.crud_user import UserDao |
17 | 17 | from backend.app.database.db_mysql import CurrentSession |
18 | 18 | from backend.app.models import User |
| 19 | +from backend.app.schemas.token import RefreshTokenTime |
19 | 20 |
|
20 | 21 | pwd_context = CryptContext(schemes=['bcrypt'], deprecated='auto') |
21 | 22 |
|
@@ -66,26 +67,32 @@ async def create_access_token(sub: str, expires_delta: timedelta | None = None, |
66 | 67 | return token, expire |
67 | 68 |
|
68 | 69 |
|
69 | | -async def create_refresh_token(sub: str, expire_time: datetime | None = None, **kwargs) -> tuple[str, datetime]: |
| 70 | +async def create_refresh_token( |
| 71 | + sub: str, expire_time: datetime | None = None, custom_expire_time: RefreshTokenTime | None = None, **kwargs |
| 72 | +) -> tuple[str, datetime]: |
70 | 73 | """ |
71 | 74 | Generate encryption refresh token |
72 | 75 |
|
73 | 76 | :param sub: The subject/userid of the JWT |
74 | 77 | :param expire_time: expiry time |
| 78 | + :param custom_expire_time: custom expiry time |
75 | 79 | :return: |
76 | 80 | """ |
77 | 81 | if expire_time: |
78 | | - expires = expire_time + timedelta(seconds=settings.TOKEN_EXPIRE_SECONDS) |
79 | | - expire_seconds = int((expires - datetime.utcnow()).total_seconds()) |
| 82 | + expire = expire_time + timedelta(seconds=settings.TOKEN_EXPIRE_SECONDS) |
| 83 | + expire_seconds = int((expire - datetime.utcnow()).total_seconds()) |
| 84 | + elif custom_expire_time: |
| 85 | + expire = custom_expire_time.expire_time |
| 86 | + expire_seconds = int((expire - datetime.utcnow()).total_seconds()) |
80 | 87 | else: |
81 | | - expires = datetime.utcnow() + timedelta(seconds=settings.TOKEN_EXPIRE_SECONDS) |
| 88 | + expire = datetime.utcnow() + timedelta(seconds=settings.TOKEN_EXPIRE_SECONDS) |
82 | 89 | expire_seconds = settings.TOKEN_EXPIRE_SECONDS |
83 | | - to_encode = {'exp': expires, 'sub': sub, **kwargs} |
| 90 | + to_encode = {'exp': expire, 'sub': sub, **kwargs} |
84 | 91 | token = jwt.encode(to_encode, settings.TOKEN_SECRET_KEY, settings.TOKEN_ALGORITHM) |
85 | 92 | # 刷新 token 时,保持旧 token 有效,不执行删除操作 |
86 | 93 | key = f'{settings.TOKEN_REDIS_PREFIX}:{sub}:{token}' |
87 | 94 | await redis_client.setex(key, expire_seconds, token) |
88 | | - return token, expires |
| 95 | + return token, expire |
89 | 96 |
|
90 | 97 |
|
91 | 98 | def get_token(request: Request) -> str: |
|
0 commit comments