Как аутентифицировать пользователя в Django rest framework с помощью http only cookie
Я использую Django и Django Rest Framework для бэкенда и Next JS для фронтенда.
Я использую аутентификацию JWT. При запросе с фронтенда я выдаю http only cookie для хранения во фронтенде.
Мой вопрос в том, как я могу разрешить частной конечной точке использовать этот cookie?
Код для генерации Cookie
def get_tokens_for_user(user):
refresh = RefreshToken.for_user(user)
return {
'refresh': str(refresh),
'access': str(refresh.access_token),
}
class LoginView(APIView):
def post(self, request, format=None):
data = request.data
response = Response()
email = data.get('email', None)
password = data.get('password', None)
user = authenticate(username=email, password=password)
if user is not None:
if user.is_active:
data = get_tokens_for_user(user)
response.set_cookie(key='token', value=data["access"], httponly=True, samesite='None', secure=True,
expires=settings.SIMPLE_JWT['ACCESS_TOKEN_LIFETIME'])
response.data = data
return response
else:
return Response({"detail": "This account is not active!!"}, status=status.HTTP_404_NOT_FOUND)
else:
return Response({"detail": "Invalid username or password!!"}, status=status.HTTP_404_NOT_FOUND)
Код для компонента входа во фронтенд
interceptor
.post("/token/", data, {
withCredentials: true,
})
.then((res) => {
router.query?.from
? router.push(router.query?.from)
: router.push("/admin");
})
Другие API частных маршрутов
class BlogTagsView(generics.ListCreateAPIView):
"""
List of Blog Tags
"""
permission_classes = [apipermissions.IsSuperUser]
queryset = models.TagModel.objects.all()
serializer_class = serializers.TagSerializers
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
# 'rest_framework.authentication.BasicAuthentication',
# 'rest_framework.authentication.SessionAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
'rest_framework.parsers.FileUploadParser',
],
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
'REFRESH_TOKEN_LIFETIME': timedelta(days=90),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'UPDATE_LAST_LOGIN': True,
# 'AUTH_COOKIE': 'token',
# 'AUTH_COOKIE_HTTP_ONLY': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUDIENCE': None,
'ISSUER': None,
'JWK_URL': None,
'LEEWAY': 0,
'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',
'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
'JTI_CLAIM': 'jti',
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True
В классе BlogTagsView
он должен был открываться для получения запроса и разрешения администратора, необходимого для запроса сообщения.
Итак, мой вопрос в том, как я могу отправлять сообщения из фронтенда и как я могу проверить и ограничить доступ к запросу на отправку сообщения в бэкенде?
Спасибо.