# -*- coding: utf-8 -*- """ 认证 API:登录(无需 Authorization)。 """ import uuid from rest_framework import status from rest_framework.decorators import api_view, authentication_classes, permission_classes from rest_framework.permissions import AllowAny from server import config from server.core.response import api_success, api_error from server.models import AuthToken from server.serializers import LoginSerializer @api_view(["POST"]) @authentication_classes([]) # 登录接口不校验 Authorization @permission_classes([AllowAny]) def login(request): """ 登录接口(支持 JSON 和 form-data): - 校验用户名/密码 - 生成 token,写入数据库 - 返回 token(前端可放到 Authorization 请求头) - 下一次登录会生成新 token,旧 token 自动失效 """ ser = LoginSerializer(data=request.data) ser.is_valid(raise_exception=True) username = ser.validated_data["username"] password = ser.validated_data["password"] if username != config.ADMIN_USERNAME or password != config.ADMIN_PASSWORD: return api_error(status.HTTP_401_UNAUTHORIZED, "用户名或密码错误") token = uuid.uuid4().hex AuthToken.objects.update_or_create( username=username, defaults={"token": token}, ) return api_success({"token": token}) @api_view(["GET"]) def get_info(request): """ 获取当前登录账号的详细信息: - 从 Authorization 头解析 token - 查 AuthToken 表反查用户名 - 返回用户名、登录时间等 """ auth_header = request.headers.get("Authorization", "") token = auth_header.replace("Bearer ", "").strip() if auth_header else "" if not token: return api_error(status.HTTP_401_UNAUTHORIZED, "未提供认证令牌") try: record = AuthToken.objects.get(token=token) except AuthToken.DoesNotExist: return api_error(status.HTTP_401_UNAUTHORIZED, "令牌无效或已过期") return api_success({ "account_id": record.id, "username": record.username, "token": record.token, "created_at": record.created_at, })