FONGOH MARTIN
FONGOH MARTIN

Reputation: 181

Return user object along side token using rest_framework_simplejwt

I am using django_rest_passwordreset for my authentication on Django rest framework.

I followed the tutorial on their official documentation and login, registration works well.

Login returns the access and refresh token. What I want to do is also return the user object alongside the access and refresh token.

I have a custom model

# auth/models.py
# Inherited from user
class MUser(AbstractUser, models.Model):
    email = models.EmailField(unique=True)
    role = models.CharField(max_length=40, default="student")

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'role']

Serializers

# auth/serializers.py
class TokenObtainPairSerializer(TokenObtainSerializer):
    @classmethod
    def get_token(cls, user):
        return RefreshToken.for_user(user)

    def validate(self, attrs):
        data = super().validate(attrs)

        refresh = self.get_token(self.user)

        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)

        if api_settings.UPDATE_LAST_LOGIN:
            update_last_login(None, self.user)

        return data

My view

# auth/views.py
class TokenObtainPairView(TokenViewBase):
    """
    Takes a set of user credentials and returns access and refresh JSON web
    token pair to prove the authentication of those credentials.
    """
    serializer_class = serializers.TokenObtainPairSerializer

So in summary, upon successful login, I receive

{
   access: xxx,
   refresh: xxx,
   
   # I want to add this 
   user: {username, first_name, last_name, email, ...}
}

Upvotes: 1

Views: 2204

Answers (3)

EteimZ
EteimZ

Reputation: 21

This might help.

serializers.py

from rest_framework import serializers
from .models import MUser

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer


class UserTokenSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserBase
        fields = [ "email", "role" ]


class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

    def validate(self, attrs):
        data = super().validate(attrs)
        data["user"] =  UserTokenSerializer(self.user).data
    
        return data 

views.py

from rest_framework_simplejwt.views import TokenObtainPairView
from .serializers import MyTokenObtainPairSerializer

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

Upvotes: 2

stue
stue

Reputation: 81

after try and error this is what worked for me

    def validate(self, attrs):
        data = super(CustomTokenObtainPairSerializer, self).validate(attrs)
        data['user'] = {
            'id': self.user.id,
            "first_name": self.user.first_name,
            "last_name": self.user.last_name,
            "email": self.user.email,
            "role": self.user.role,
            "telephone": str(self.user.telephone)
        }

        return data

Upvotes: 0

Ohad the Lad
Ohad the Lad

Reputation: 1929

I guess this might help you:

def validate(self, attrs):
    data = super().validate(attrs)

    refresh = self.get_token(self.user)

    data['refresh'] = str(refresh)
    data['access'] = str(refresh.access_token)

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    my_user = User.objects.filter(pk=self.user.id).first()
    if my_user:
        # use user serelizor or parse required fields
        data['user'] = my_user
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    if api_settings.UPDATE_LAST_LOGIN:
        update_last_login(None, self.user)

    return data

Upvotes: 6

Related Questions