Django Rest API Djoser Refre sh и проблема с токеном доступа - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь получить доступ и обновить токены sh, когда пользователь регистрируется с помощью / auth / users / endpoint.

Я уже расширил сериализатор, и он показывает все настраиваемые поля. Он успешно регистрирует пользователя и возвращает результат следующим образом:

{
    "mobile": "12345",
    "driving_id": "478161839",
    "full_name": "John Doe",

} 

Здесь я хотел бы получить доступ и обновить токен sh. Я читал, что djoser использует django простую библиотеку jwt для обеспечения доступа и обновления sh токенов. Это функция для создания токенов вручную, которую я могу сделать, но единственное, чего я не понимаю, - это куда возвращать данные с другими деталями.

from rest_framework_simplejwt.tokens import RefreshToken

def get_tokens_for_user(user):
    refresh = RefreshToken.for_user(user)

    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

1 Ответ

0 голосов
/ 26 апреля 2020

Я решил это, но я не знаю, является ли это лучшим способом или нет. Я импортировал пользовательский набор из djoser.views, а затем переопределил метод create. Я извлекаю пользователя, а затем создаю для него токены JWT, добавляю его к ответу и возвращаю его.

from rest_framework import status
from djoser.views import UserViewSet
from djoser import signals
from djoser.compat import get_user_email

from rest_framework_simplejwt.tokens import RefreshToken


class CustomRegistrationView(UserViewSet):

    def perform_create(self, serializer):
        user = serializer.save()
        signals.user_registered.send(
            sender=self.__class__, user=user, request=self.request
        )

        context = {"user": user}
        to = [get_user_email(user)]
        if settings.SEND_ACTIVATION_EMAIL:
            settings.EMAIL.activation(self.request, context).send(to)
        elif settings.SEND_CONFIRMATION_EMAIL:
            settings.EMAIL.confirmation(self.request, context).send(to)


    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        response_data = serializer.data

        user = User.objects.get(username = response_data['username'])
        refresh = RefreshToken.for_user(user)
        response_data['refresh'] = str(refresh)
        response_data['access'] = str(refresh.access_token)

        return Response(response_data, status=status.HTTP_201_CREATED, headers=headers)
...