JWT и пользовательская аутентификация в Django Rest Framework

Я написал очень простой пользовательский класс аутентификации, чтобы реализовать простую библиотеку JWT для моих пользовательских нужд аутентификации.

Я генерирую токены вручную, а затем отправляю токен доступа к моему API. По умолчанию этого будет достаточно, но поскольку я не использую модель пользователя Django по умолчанию, я получаю User not found. Это потому, что мне нужно реализовать собственный сервер аутентификации.

Мне нужно прочитать этот токен, чтобы запросить базу данных с заданным идентификатором пользователя и проверить, действителен ли этот токен. В моем примере я зафиксировал номер 2.

введите описание изображения здесь

class ExampleAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        try:
            user = vAuthUser.objects.get(pk=2) #this should receive the user_id from the token
        except:
            raise AuthenticationFailed('No such user')

        return (user, None)

Мой API выглядит так:

class MyAPI(APIView):
    authentication_classes = (ExampleAuthentication,)
    permission_classes = (IsAuthenticated ,)

   def get()...

person csandreas1    schedule 27.12.2020    source источник
comment
так в чем именно ваш вопрос? непонятно что тебе нужно   -  person mahyard    schedule 27.12.2020
comment
Использование простого JWT с настраиваемой аутентификацией не работает должным образом. Я генерирую токен, отправляю его, но как я могу прочитать его в пользовательском классе аутентификации, чтобы правильно аутентифицировать пользователя?   -  person csandreas1    schedule 27.12.2020


Ответы (1)


Попробуй это:

from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth.models import User
user = User.objects.first()
refresh = RefreshToken.for_user(user)
raw_token = str(refresh.access_token)

jwt_a = JWTAuthentication()
validated_token = jwt_a.get_validated_token(raw_token)
repr(validated_token)
print(validated_token["user_id"])

Здесь я передаю необработанный токен доступа get_validated_token() методу класса JWTAuthentication. он возвращает словарь с этими ключами: token_type, jti, user_id, exp и их связанными значениями.
Я использовал модель пользователя Django по умолчанию для своего образца, но она должна работать с вашей пользовательской моделью.
Есть более полезные методы вроде get_header(). проверьте этот документ person mahyard    schedule 27.12.2020