Files
LoveACE-EndF/router/login/__init__.py
2025-08-03 16:50:56 +08:00

110 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import Depends
from fastapi.routing import APIRouter
from database.user import User
from database.creator import get_db_session
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from router.login.model import (
LoginRequest,
LoginResponse,
AuthmeResponse,
AuthmeStatusData,
)
from router.invite.model import AuthMeData
from provider.aufe.client import AUFEConnection
from provider.loveac.authme import manage_user_tokens, generate_device_id, fetch_user_by_token, AuthmeRequest
import secrets
login_router = APIRouter(prefix="/api/v1/user")
@login_router.post("/login", summary="用户登录")
async def login_user(
data: LoginRequest, asyncsession: AsyncSession = Depends(get_db_session)
) -> LoginResponse:
"""
用户登录
:param data: LoginRequest
:return: LoginResponse
"""
async with asyncsession as session:
userid = data.userid
password = data.password
easyconnect_password = data.easyconnect_password
# 检查用户是否存在
existing_user = await session.execute(select(User).where(User.userid == userid))
user = existing_user.scalars().first()
if not user:
return LoginResponse(
code=400,
message="用户不存在",
data=None,
)
# 检查连接
vpn = AUFEConnection.create_or_get_connection("vpn.aufe.edu.cn", userid)
# 检查连接是否已经存在,避免重复登录
if not vpn.login_status():
if not await vpn.login(userid, easyconnect_password):
return LoginResponse(
code=400,
message="VPN登录失败请检查用户名和密码",
data=None,
)
if not vpn.uaap_login_status():
if not await vpn.uaap_login(userid, password):
return LoginResponse(
code=400,
message="大学登录失败,请检查用户名和密码",
data=None,
)
# 生成新的token和设备ID
authme_token = secrets.token_urlsafe(128)
device_id = generate_device_id()
# 使用新的token管理系统
await manage_user_tokens(userid, authme_token, device_id, session)
return LoginResponse(
code=200,
message="登录成功",
data=AuthMeData(authme_token=authme_token),
)
@login_router.post("/authme", summary="验证登录状态")
async def check_auth_status(
data: AuthmeRequest, asyncsession: AsyncSession = Depends(get_db_session)
) -> AuthmeResponse:
"""
验证token是否有效返回登录状态
:param data: AuthmeRequest
:return: AuthmeResponse
"""
try:
# 使用已有的fetch_user_by_token函数验证token
user = await fetch_user_by_token(data, asyncsession)
return AuthmeResponse(
code=200,
message="验证成功",
data=AuthmeStatusData(
is_logged_in=True,
userid=user.userid
),
)
except Exception as e:
# token无效或其他错误
return AuthmeResponse(
code=401,
message="token无效或已过期",
data=AuthmeStatusData(
is_logged_in=False,
userid=None
),
)