Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to obtain a token for a user with payload using Django Simple JWT

I can get a correct token when calling the URL /token/ but I wish to create a token manually for the user when /login/ is called.

urls.py:

    from django.urls import path
    from . import views
    from .views import MyTokenObtainPairView

    from rest_framework_simplejwt.views import (
        TokenRefreshView,
        TokenVerifyView
    )

    urlpatterns = [
        path('', views.api_root),
        path('register/', views.register),
        path('login/', views.login),
        path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
        path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
        path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),
    ]

views.py:

@api_view(['POST'])
def login(request):
    email = request.data.get('email')
    password = request.data.get('password')
    user = get_object_or_404(User, email=email)

    if make_password(password) == user.password:
        if not user.is_active:
            return Response({"error": "User is not active"}, status=400)
        tokens = MyTokenObtainPairView.get_token(user)
        parse_token = {
            'refresh': str(tokens),
            'access': str(tokens.access_token),
        }
        return Response(status=200, data=parse_token)
    else:
        return Response(status=401)

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super().validate(attrs)
        refresh = self.get_token(self.user)
        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)

        # Add extra responses here
        data['username'] = self.user.username
        data['groups'] = self.user.groups.values_list('name', flat=True)
        data['test'] = '1234'
        return data

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

How do I modify this line to get my token for a specific user? tokens = MyTokenObtainPairView.get_token(user)

I have read the doc about manually create token by importing this: from rest_framework_simplejwt.tokens import RefreshToken but it is not adding the payload into the token...

like image 970
Karen Azuma Avatar asked Sep 15 '25 22:09

Karen Azuma


1 Answers

Actually after Googling for an hour I finally got a solution from another post...

Proper way to do this:

    refresh = RefreshToken.for_user(user)
    refresh['user_name'] = user.username
    refresh['first_name'] = user.first_name
    refresh['last_name'] = user.last_name
    refresh['full_name'] = user.get_full_name()
    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

In case someone would need this...

like image 169
Karen Azuma Avatar answered Sep 19 '25 08:09

Karen Azuma