Проблема с аутентификацией Django JWT TokenObtainPairView

Я пытаюсь использовать CustomTokenObtainPairView, чтобы получить свое имя пользователя в токене.

Просмотры:

if user.check_password(password):
            # refresh = RefreshToken.for_user(user)
            # refresh.access_token['username'] = user.username
            # token = str(refresh.access_token)
            request.data = {
                'username': username,
                'password': password
            }
            token_response = CustomTokenObtainPairView.post(request=request.data)


            response = Response()
            response.set_cookie(key='jwt', value=token_response.data['access'], httponly=True,     
            secure=True)
            response.data = {
                'access': token_response.data['access']
            }
            return response
        else:
            return Response({'message': 'Wrong password!'}, status=400)

Я попытался сгенерировать токен и добавить в него имя пользователя, но это не сработало. Если кто-нибудь знает, как правильно использовать TokenObtainPairView в вашей функции, пожалуйста, помогите.

Я вижу, ты называешь вид CustomTokenObtainPairView.post(request=request.data). Это представление, которое вы определили? Если да, можете ли вы дать его определение? Если это часть библиотеки, то какой библиотеки?

Nick ODell 27.07.2024 20:58

CustomTokenObtainPairSerializer — это модифицированный TokenObtainPairView, который позволяет мне генерировать токен JWT с полем имени пользователя. Библиотека djangorestframework-simplejwt.

Sk09 27.07.2024 21:03

Можете ли вы предоставить код, который вы использовали для этого?

Nick ODell 27.07.2024 21:04

'из rest_framework_simplejwt.serializers импортировать класс TokenObtainPairSerializer CustomTokenObtainPairSerializer(TokenObtainPairSerializer): @classmethod def get_token(cls, user): token = super().get_token(user) token['username'] = user.username return token'

Sk09 27.07.2024 21:22

Можете ли вы отредактировать свой вопрос и вставить в него код?

Nick ODell 28.07.2024 00:56

«Я пытался сгенерировать токен и добавить в него имя пользователя, но это не сработало». Вы можете быть более конкретным? Что пошло не так? Если есть ошибка, то какая?

Nick ODell 28.07.2024 00:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хотите добавить имя пользователя в полезную нагрузку токена JWT? или хотите найти имя пользователя через токен JWT?

да, я хочу добавить имя пользователя в свой токен. Но когда я генерирую токен с помощью функции RefreshToken.for_user(user). Его нельзя настроить, поэтому я предполагаю, что это можно сделать с помощью TokenObtainPairView, но я не понимаю, как вызвать этот метод в функции входа в систему или как он работает, поэтому я задал вопрос.

Sk09 28.07.2024 21:29
Ответ принят как подходящий
Если вы хотите изменить требования токена, вам следует настроить TokenObtainPairSerializer.
my_app/serializers.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.tokens import Token


class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user) -> Token:
        token = super().get_token(user=user)
        token["username"] = user.username
        return token
settings.py
...
SIMPLE_JWT = {
  "TOKEN_OBTAIN_SERIALIZER": "my_app.serializers.MyTokenObtainPairSerializer",
}
...
Если вы хотите изменить способ предоставления токенов (вы можете использовать файлы cookie), вам следует настроить TokenObtainPairView или TokenRefreshView.
my_app/views.py
from rest_framework import status
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework_simplejwt.exceptions import TokenError, InvalidToken
from rest_framework_simplejwt.views import TokenObtainPairView


class CustomTokenObtainPairView(TokenObtainPairView):
    def post(self, request: Request, *args, **kwargs) -> Response:
        serializer = self.get_serializer(data=request.data)
        try:
            serializer.is_valid(raise_exception=True)
        except TokenError as e:
            raise InvalidToken(e.args[0])

        response = Response(data=None, status=status.HTTP_200_OK)
        response.set_cookie(key = "access", value=serializer.validated_data["access"], httponly=True, secure=True)
        response.set_cookie(key = "refresh", value=serializer.validated_data["refresh"], httponly=True, secure=True)
        return response

urls.py
from my_app.views import CustomTokenObtainPairView

urlpatterns = [
    ...
    path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
    ...
]
Вы можете сделать то же самое со своим TokenRefreshView.

Другие вопросы по теме