迁移服务层

This commit is contained in:
2025-10-10 18:11:36 +08:00
parent a71cde7b82
commit 93830c3d03
13 changed files with 437 additions and 188 deletions

View File

@@ -1,50 +1,16 @@
# 导入库
from typing import Annotated
from datetime import datetime, timedelta, timezone
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordRequestForm
from fastapi import APIRouter
import jwt, JWT
from sqlmodel.ext.asyncio.session import AsyncSession
from pkg import Password
from loguru import logger
from model import Setting, User, database
from fastapi import APIRouter, Depends, HTTPException
from fastapi.security import OAuth2PasswordRequestForm
from sqlmodel.ext.asyncio.session import AsyncSession
from model import database
from model.response import TokenResponse
from services import session as session_service
Router = APIRouter(tags=["令牌 session"])
# 创建访问令牌
async def create_access_token(
session: AsyncSession,
data: dict,
expires_delta: timedelta | None = None
):
to_encode = data.copy()
if expires_delta:
expire = datetime.now(timezone.utc) + expires_delta
else:
jwt_exp_setting = await Setting.get(session, Setting.name == 'jwt_token_exp')
expire = datetime.now(timezone.utc) + timedelta(int(jwt_exp_setting.value))
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, key=await JWT.get_secret_key(), algorithm='HS256')
return encoded_jwt
# 验证账号密码
async def authenticate_user(session: AsyncSession, username: str, password: str):
# 验证账号和密码
account = await User.get(session, User.email == username)
if not account:
logger.error("Account or password not set in settings.")
return False
if account.email != username or not Password.verify(account.password, password):
logger.error("Invalid username or password.")
return False
return account
# FastAPI 登录路由 / FastAPI login route
@Router.post(
path="/api/token",
@@ -57,22 +23,16 @@ async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
session: Annotated[AsyncSession, Depends(database.Database.get_session)],
) -> TokenResponse:
user = await authenticate_user(
session=session,
username=form_data.username,
password=form_data.password
token_response = await session_service.login_for_access_token(
session=session,
username=form_data.username,
password=form_data.password,
)
if not user:
if not token_response:
raise HTTPException(
status_code=401,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token = await create_access_token(
session=session,
data={"sub": user.email},
)
return TokenResponse(
access_token=access_token,
)
return token_response