Reputation: 181
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
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
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
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