Files
boss_dp/server/api/auth.py

52 lines
1.5 KiB
Python
Raw Normal View History

2026-02-12 18:22:02 +08:00
# -*- coding: utf-8 -*-
"""
认证 API登录无需 token
"""
2026-02-12 18:17:15 +08:00
import uuid
2026-02-14 16:49:44 +08:00
from rest_framework import status
2026-02-25 00:20:16 +08:00
from rest_framework.decorators import api_view, authentication_classes, permission_classes
2026-02-14 16:49:44 +08:00
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
2026-02-12 18:17:15 +08:00
2026-02-14 16:49:44 +08:00
from server import config
from server.models import AuthToken
from server.serializers import LoginSerializer
2026-02-12 18:17:15 +08:00
2026-02-14 16:49:44 +08:00
@api_view(["POST"])
2026-02-25 00:20:16 +08:00
@authentication_classes([]) # 登录接口不校验 Cookie token避免未带 Cookie 时被默认权限判为 403
2026-02-14 16:49:44 +08:00
@permission_classes([AllowAny])
def login(request):
2026-02-12 18:17:15 +08:00
"""
2026-02-12 18:18:58 +08:00
登录接口支持 JSON form-data
- 校验用户名/密码
- 生成 token写入数据库
- 通过 Set-Cookie 返回 auth_token前端后续请求自动携带
- 下一次登录会生成新 token token 自动失效
2026-02-12 18:17:15 +08:00
"""
2026-02-14 16:49:44 +08:00
ser = LoginSerializer(data=request.data)
ser.is_valid(raise_exception=True)
username = ser.validated_data["username"]
password = ser.validated_data["password"]
2026-02-12 18:18:58 +08:00
2026-02-14 16:49:44 +08:00
if username != config.ADMIN_USERNAME or password != config.ADMIN_PASSWORD:
return Response({"detail": "用户名或密码错误"}, status=status.HTTP_401_UNAUTHORIZED)
2026-02-12 18:17:15 +08:00
token = uuid.uuid4().hex
2026-02-14 16:49:44 +08:00
AuthToken.objects.update_or_create(
username=username,
defaults={"token": token},
)
2026-02-12 18:17:15 +08:00
2026-02-14 16:49:44 +08:00
resp = Response({"token": token})
resp.set_cookie(
2026-02-12 18:17:15 +08:00
key="auth_token",
value=token,
httponly=True,
2026-02-12 18:18:58 +08:00
max_age=365 * 24 * 60 * 60,
2026-02-14 16:49:44 +08:00
samesite="Lax",
2026-02-12 18:17:15 +08:00
)
2026-02-14 16:49:44 +08:00
return resp