Django - Получение информации о пользователе с помощью JWT-токена
МОЯ ФУНКЦИЯ ПОКАЗЫВАЕТ ТОКЕН API только когда я перехожу по ссылке (user-info)API/login. Я хочу показать токены API с информацией о пользователе. http://127.0.0.1:8000/api/login/ ссылка показывает API с информацией о пользователе
# Import libraries
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from base.api.serializers import UserSerializer
from base.models import User
from rest_framework.permissions import IsAuthenticated, AllowAny
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['username'] = user.username
return token
# Token Access
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
# Registration
class RegisterView(APIView):
permission_classes = [AllowAny]
def post(self, request):
serializer = UserSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
# User information
class LoginView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
user_id = request.user.id
user = User.objects.get(id=user_id)
serializer = UserSerializer(user)
return Response(serializer.data)
В этом случае вам необходимо изменить MyTokenObtainPairSerializer. Сначала создайте новый User Serializer, который будет содержать информацию о пользователе.
Нравится :
from rest_framework_simplejwt.tokens import RefreshToken
class UserSerializerWithToken(UserSerializer):
token = serializers.SerializerMethodField(read_only=True)
class Meta:
model = CustomUser
fields = ['username',
'isAdmin',
# ...
'token']
def get_token(self, obj):
token = RefreshToken.for_user(obj)
return str(token.access_token)
Затем измените Вид
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
serializer = UserSerializerWithToken(self.user).data
for k, v in serializer.items():
data[k] = v
return data
Теперь сделайте еще один для входа в систему.
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
URL для входа в систему :
path('login/', views.MyTokenObtainPairView.as_view(),