Как получить доступ к экземпляру пользователя в пользовательской системе входа?

Я хочу сделать очень индивидуальную систему входа в систему, и у меня не получается получить экземпляр пользователя, когда токен отправляется в headers. У меня есть несколько API, которые должны работать с пользователями, вошедшими в систему, и без них, и им нужен доступ к user.id (первичный ключ). В моем пользовательском Login я хочу получить экземпляр пользователя и выполнить пользовательскую проверку. Но я никогда не могу получить доступ к пользователю, даже если токен создан и отправляется в заголовке.

Я отправляю токен в заголовке в Postman:

"Authorization": "Token {{token}}"

settings.py:

.....

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'channels',
    'corsheaders',
    'pgtrigger',
    'rest_framework',
    'rest_framework.authtoken',

    'myapp'
]

.....

AUTH_USER_MODEL = "myapp.User"

.....

login.py:

from typing import Any

from django.db.models import Q

from rest_framework.authentication import BasicAuthentication, SessionAuthentication, TokenAuthentication
from rest_framework.authtoken.models import Token
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.request import Request, QueryDict
from rest_framework.views import APIView

import bcrypt

from myapp.util.functions import contains, API_CallBack
from myapp.util.classes import Error

from myapp.models.user.user import User

class Endpoint(APIView):

    authentication_classes = [BasicAuthentication, SessionAuthentication]
    permission_classes = [AllowAny]

    def post(self, request: Request):

        # --------------------
        # Get and Check Data
        # --------------------

        print()
        print(request.user)       // NOT GETTING THE USER HERE
        print()

        par: QueryDict = request.data
        if (
            not contains(par) or
            not (par.keys() >= { "id", "password" })
        ): return API_CallBack(Error("gRXIQWhkb6"))

        _return = Error("eKKld8iqrz")
        try:
            _return = Login(request, par["id"], par["password"])
        except Error as e: _return = e
        return API_CallBack(_return)

def Login(request: Request, id: str, password: str) -> dict[str, str]:

    # -------------------------------
    # Check and Format Data
    # -------------------------------

    # req.session.modified = True
    if (
        not contains(request, id, password) or
        Token.objects.filter(user = request.user).exists()
    ): raise Error("ulxdQrfrP2")

    # -------------------------------------
    # Execute Queries and Perform
    # -------------------------------------

    try:
        user: User = User.objects.filter(
            Q(account_name__exact = id) | Q(email__exact = id)
        ).get()

        # Start Session
        if bcrypt.checkpw(password.encode("UTF8"), user.password.encode("UTF8")):
            token: Token = Token.objects.create(user = user)
            return { "token": token.key }

        else:
            raise Error("tSqmORm1y5", 404, "empty", "No record found with inserted inputs")

    except User.DoesNotExist:
        raise Error("h0lddS4Jtn", 404, "empty", "No record found with inserted inputs")
    except Exception as e:
        print(f"\n{str(e)}\n")

    raise Error("SwZu4K4N1p", message="Token already exists")
<

Похоже, что конкретное сообщение об ошибке, которое вы видите, вызвано непосредственно из TokenAuthentiation или BasicAuthentication класса.

if not token.user.is_active:
    raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))

Session auth, к моему удивлению, не вызывает такого вопроса.

Вернуться на верх