Samyak Jain
Samyak Jain

Reputation: 25

Django+React rest-auth

I am using the rest-auth module to enable user authentication on my web app. Though I am facing some difficulties in fetching details about the user. The Django-rest-framework return a key when I post my username and password, while that's enough for logging in I also want to fetch additional details like user.is_staff, user.username and user.email.

I tried to use Token serializer, but I am not sure if I am doing it right.

** settings.py ** 

REST_AUTH_SERIALIZERS = {
    'TOKEN_SERIALIZER': '## How to define the path to my serializer ##',
}

** serializers.py **

from rest_framework import serializers
from lms.models.post_models import Post
from django.contrib.auth.models import User
from rest_auth.models import TokenModel    

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email')

class TokenSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = TokenModel
        fields = ('key', 'user')

Please tell what piece is missing or if any piece is incorrect. Also, please help me figure out the part between ## ##.

Thank you!

Upvotes: 1

Views: 506

Answers (1)

Sadan A.
Sadan A.

Reputation: 1107

I think you are doing it right, in your custom TokenSerializer you need to fetch the user somehow. If I look at the code of the LoginView, I see that you can use request object from context within serializer, so your TokenSerializer should be like:

# serializers.py

class TokenSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    class Meta:
        model = TokenModel
        fields = ('key', 'user')

    def get_user(self, instance):
        request = self.context.get('request')
        return UserSerializer(request.user).data

and then settings.py

REST_AUTH_SERIALIZERS = {
    'TOKEN_SERIALIZER': 'project.serializers.TokenSerializer',
}


EDITED: This might break your register view because if you look at the source code, at line 60 it uses the same serializer but doesn't pass the request object in the context of serializer. You can make it work by overriding this method

# views.py

from django.conf import settings
from rest_auth.registeraion.views import RegisterView
from allauth.account import app_settings as allauth_settings
from rest_auth.app_settings import (TokenSerializer,
                                    JWTSerializer)


class CustomRegisterView(RegisterView):
    def get_response_data(self, user):
        if allauth_settings.EMAIL_VERIFICATION == \
                allauth_settings.EmailVerificationMethod.MANDATORY:
            return {"detail": _("Verification e-mail sent.")}

        if getattr(settings, 'REST_USE_JWT', False):
            data = {
                'user': user,
                'token': self.token
            }
            return JWTSerializer(data).data
        else:
            return TokenSerializer(user.auth_token, context={"request": self.request}).data

and then use this view for registration in your urls

# urls.py
from views import CustomRegisterView


urlpatterns = [
    ...,
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', CustomRegisterView.as_view())
    ]

Upvotes: 1

Related Questions