REST API Django Authentication не возвращает обновление в пакете Simple Rest
Я изучаю DJANGO REST API и мой источник обучения - курс UDEMY 2017, и преподаватель использует django 1.1 для Rest framework для JWT, тогда как на моей системе он не поддерживается. Поэтому сайт Django REST API рекомендует использовать Simple JWT
.
Поэтому я решил использовать Simple JWT
. Мой источник https://django-rest-framework-simplejwt.readthedocs.io/en/latest/getting_started.html#installation
Так что в **settings*
* я поместил :
from datetime import timedelta
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_FILTER_BACKENDS':(
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
),
'SEARCH_PARAM':'search',
'ORDERING_PARAM':'ordering',
}
JWT_AUTH = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'UPDATE_LAST_LOGIN': True,
'AUTH_HEADER_TYPES': ('Bearer',),
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'JTI_CLAIM': 'jti',
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
**in my scripts/rest_framework_api.py :**
import requests
import json
AUTH_ENDPOINT = "http://127.0.0.1:8000/api/auth/jwt/"
REFRESH_ENDPOINT = AUTH_ENDPOINT + "refresh/"
ENDPOINT="http://127.0.0.1:8000/api/status/"
headers = { "Content-Type": "application/json" }
data = {
'username':'lulu',
'password':'lulu'
}
r = requests.post(AUTH_ENDPOINT,data=json.dumps(data),headers=headers)
token = r.json()['access']
refresh_data = { 'token': token }
new_response = requests.post(REFRESH_ENDPOINT,data=json.dumps(refresh_data),headers=headers)
new_token = new_response.json()
print(new_token)
в урлах :
from django.contrib import admin
from django.urls import path,include
from rest_framework_simplejwt.views import (TokenObtainPairView,TokenRefreshView,)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/auth/jwt/', TokenObtainPairView.as_view()),
path('api/auth/jwt/refresh/', TokenRefreshView.as_view()),
path('api/status/', include('status.api.urls'))
]
in **views.py** :
from rest_framework import generics, mixins, permissions
from rest_framework.authentication import SessionAuthentication
from rest_framework.views import APIView
from rest_framework.response import Response
import json
from django.shortcuts import get_object_or_404
from status.models import Status
from .serializers import StatusSerializer
def is_json(json_data):
try:
real_json = json.loads(json_data)
is_valid = True
except ValueError:
is_valid = False
return is_valid
class StatusDetailAPIView(generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
serializer_class = StatusSerializer
queryset = Status.objects.all()
lookup_field='id'
class StatusAPIView(mixins.RetrieveModelMixin,generics.ListAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
serializer_class = StatusSerializer
passed_id= None
search_fields = ('user__username','content')
queryset = Status.objects.all()
def perform_create (self,serializer):
serializer.save(user=self.request.user)
После всего этого на стороне клиента возвращается: {'refresh': ['This field is required.']}
На моей стороне я получаю следующее :
[07/Jan/2022 07:12:31] "POST /api/auth/jwt/ HTTP/1.1" 200 483
Bad Request: /api/auth/jwt/refresh/
[07/Jan/2022 07:12:31] "POST /api/auth/jwt/refresh/ HTTP/1.1" 400 39
Может ли кто-нибудь объяснить, что я делаю неправильно? Как это исправить и получить обновление? Тьютор объясняет, что нужно изменить в настройках "JWT_ALLOW_REFRESH":False
на True
и тогда это работает в его лекциях. Однако в стандартных настройках в Simple JWT нет JWT_ALLOW_REFRESH
и настройки отличаются от старых настроек JWT. Что мне нужно сделать? Как мне превратить это в True
в Simple JWT
?
если я использую только #
token_refresh = r.json()['refresh']
print (token_refresh)
он будет возвращать refresh. Также refresh_data = { 'token': token }
если возвращается : token is not recongnised
или если я поставлю вместо 'token' 'refresh', он заявляет, что не принимает строку.
Помогите, пожалуйста, разобраться в различиях между этими пакетами и исправить проблемы, с которыми я столкнулся в системе, чтобы мое обновление возвращалось без проблем. Что бы вы порекомендовали сделать?
Ошибочный ответ конечной точки API /api/auth/jwt/refresh/
означает, что вам необходимо поместить токен обновления в поле refresh
(а не в поле token
) тела POST-запроса в коде тестирования клиента, путь /api/auth/jwt/refresh/
внутренне разрешается в TokenRefreshView, который использует TokenRefreshSerializer для валидации ввода, а сериализатор требует refresh
поля.