Пытаюсь получить пользователя по токену
#serializers.py
from rest_framework import serializers
from profiles.models import UserProfile
from user.models import User
from django.contrib.auth import authenticate
from django.contrib.auth.models import update_last_login
from rest_framework import serializers
from rest_framework_jwt.settings import api_settings
from user.models import User
JWT_PAYLOAD_HANDLER=api_settings.JWT_PAYLOAD_HANDLER
JWT_ENCODE_HANDLER=api_settings.JWT_ENCODE_HANDLER
class UserSerializer(serializers.ModelSerializer):
class Meta:
model=UserProfile
fields=('first_name','last_name','phone_number','age','gender')
class UserRegistrationSerializer(serializers.ModelSerializer):
profile=UserSerializer(required=True)
class Meta:
model=User
fields=('email','password','profile')
extra_kwargs={'password':{'write_only':True}}
def create(self, validated_data):
profile_data=validated_data.pop('profile')
user=User.objects.create_user(**validated_data)
UserProfile.objects.create(
user=user,
first_name=profile_data['first_name'],
last_name=profile_data['last_name'],
phone_number=profile_data['phone_number'],
age=profile_data['age'],
gender=profile_data['gender']
)
return user
class UserLoginSerializer(serializers.ModelSerializer):
email=serializers.CharField(max_length=255)
password=serializers.CharField(max_length=255, write_only=True)
token=serializers.CharField(max_length=255, read_only=True)
def validate(self, data):
email=data.get("email",None)
password=data.get("password",None)
user=authenticate(email=email,password=password)
if user is None:
raise serializers.ValidationError(
'Если пользовательне нашел email и password'
)
try:
payload=JWT_PAYLOAD_HANDLER(user)
jwt_token=JWT_ENCODE_HANDLER(payload)
update_last_login(None,user)
except User.DoesNotExist:
raise serializers.ValidationError(
'Пользователь отправляет почту и пароль . Он не должен быть пустым'
)
return {
'email':user.email,
'token':jwt_token
}
#views.py
from django.shortcuts import render
# Create your views here.
# выдает статус кода()
from rest_framework import status
# создание аpi
from rest_framework.generics import CreateAPIView
# отправляет ответ
from rest_framework.response import Response
# разрешение всем
from rest_framework.permissions import AllowAny
from .serializers import \
UserRegistrationSerializer,\
UserLoginSerializer
from profiles.models import UserProfile
from rest_framework.generics import RetrieveAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
# создание представления путем расширения CreateAPIView.
class UserRegistrationView(CreateAPIView):
# Serializer_class сообщает, какой сериализатор использовать,
serializer_class = UserRegistrationSerializer
# а permission_classes определяет, кто может получить доступ к API.
permission_classes = (AllowAny,)
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
status_code = status.HTTP_201_CREATED
response = {
'success': 'True',
'status code': status_code,
'message': 'User registered successfully',
}
return Response(response, status=status_code)
class UserLoginView(RetrieveAPIView):
permission_classes = (AllowAny,)
serializer_class = UserLoginSerializer
def post(self,request):
serializer=self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
response={
'success':'True',
'status_code':status.HTTP_200_OK,
'message':'Ваш логин успешно зарегистрирован',
'token':serializer.data['token']
}
status_code=status.HTTP_200_OK
return Response(response, status=status_code)
class UserProfileView(RetrieveAPIView):
permission_classes = (IsAuthenticated,)
authentication_classes = JSONWebTokenAuthentication
def get(self, request):
try:
user_profile=UserProfile.objects.get(user=request.user)
status_code=status.HTTP_200_OK
response={
'success':'true',
'status code':status_code,
'message':'User profile fetched successfully',
'data':[
{
'first_name':user_profile.first_name,
'last_name':user_profile.last_name,
'phone_number':user_profile.phone_number,
'age':user_profile.phone_number,
'gender':user_profile.gender,
}
]
}
except Exception as e:
status_code=status.HTTP_400_BAD_REQUEST
response={
'success':'false',
'status code':status.HTTP_400_BAD_REQUEST,
'message':'User does not exists',
'error':str(e)
}
return Response(response, status=status_code)
#settings
AUTH_USER_MODEL='user.User'
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
REST_FRAMEWORK={
# разрешение на уровне проекта
'DEFAULT_PERMISSION_CLASSES':(
# разрешение для авторизованных
'rest_framework.permissions.IsAuthenticated',
# разрешение для админа
'rest_framework.permissions.IsAdminUser',
),
'DEFAULT_AUTHENTICATION_CLASSES':(
# для выдачи json web token
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
# для определения настройки JWT
# JSONWebTokenAuthentication
JWT_AUTH={
# JWT_ENCODE_HANDLER: полезная нагрузка, которую мы хотим кодировать.
'JWT_ENCODE_HANDLER':
'rest_framework_jwt.utils.jwt_encode_handler',
'JWT_DECODE_HANDLER':
'rest_framework_jwt.utils.jwt_decode_handler',
# JWT_PAYLOAD_HANDLER: данные, которые мы хотим передать как полезную нагрузку.
'JWT_PAYLOAD_HANDLER':
'rest_framework_jwt.utils.jwt_payload_handler',
'JWT_PAYLOAD_GET_USER_ID_HANDLER':
'rest_framework_jwt.utils_get_user_id_from_payload_handler',
# JWT_SECRET_KEY: секретный ключ для кодирования / декодирования токена
'JWT_SECRET_KEY':'SECRET_KEY',
'JWT_GET_USER_KEY':None,
'JWT_PUBLIC_KEY':None,
'JWT_PRIVATE_KEY':None,
# JWT_ALGORITHM: какой алгоритм использовать
'JWT_ALGORITM':'HS256',
# JWT_VERIFY: если мы хотим проверить токен, всегда должно быть True
'JWT_VERIFY':True,
# JWT_VERIFY_EXPIRATION: если срок действия токена истек.
'JWT_VERIFY_EXPIRATION':True,
'JWT_AUDIENCE':True,
'JWT_ISSUER':None,
'JWT_ALLOW_REFRESH':False,
# JWT_EXPIRATION_DELTA: время истечения срока действия токена, можно в минутах, часах, днях
'JWT_REFRESH_EXPIRATION_DELTA':timedelta(days=30),
# JWT_AUTH_HEADER_PREFIX: префикс, который будет использоваться с токеном,
# как правило, мы предпочитаем Bearer
'JWT_AUTH_HEADER_PREFIX':'Bearer',
'JWT_AUTH_COOKIE':None
}