34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy import or_, select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.api.deps import get_current_user
|
|
from app.core.database import get_db
|
|
from app.core.security import create_access_token, hash_password, verify_password
|
|
from app.models import User
|
|
from app.schemas.core import LoginIn, TokenOut, UserCreate, UserOut, UserUpdate
|
|
from app.schemas.common import Page
|
|
|
|
router = APIRouter(prefix="/auth", tags=["认证"])
|
|
|
|
|
|
@router.post("/login", response_model=TokenOut)
|
|
async def login(payload: LoginIn, db: AsyncSession = Depends(get_db)):
|
|
result = await db.execute(
|
|
select(User).where(
|
|
or_(User.username == payload.username, User.email == payload.username),
|
|
User.is_deleted == False,
|
|
)
|
|
)
|
|
user = result.scalar_one_or_none()
|
|
if not user or not verify_password(payload.password, user.password_hash):
|
|
raise HTTPException(status_code=400, detail="用户名或密码错误")
|
|
if user.status != "enabled":
|
|
raise HTTPException(status_code=403, detail="用户已禁用")
|
|
return TokenOut(access_token=create_access_token(user.id, {"username": user.username}))
|
|
|
|
|
|
@router.get("/me", response_model=UserOut)
|
|
async def me(user: User = Depends(get_current_user)):
|
|
return user
|