Django dj-rest-auth не устанавливает cookie, несмотря на JWT_AUTH_REFRESH_COOKIE

У меня есть простое приложение Django, управляющее аутентификацией и регистрацией пользователей с помощью dj-rest-auth и JWT. В соответствии с docs, я настроил приложение на использование JWT с помощью плагина simple-jwt в settings.py:

  • JWT_AUTH_COOKIE = 'my-app-auth'
  • JWT_AUTH_REFRESH_COOKIE = 'my-refresh-token'
  • .

Ожидаемое поведение: Cookies должны быть установлены на /dj-rest-auth/login/ и /token/refresh

Проблема: Cookies корректно устанавливаются ТОЛЬКО на /dj-rest-auth/login/, но не на /token/refresh.

Этот вопрос не является чем-то новым, поскольку он должен быть решен здесь и здесь.

Итак, я также добавил предложенное middleware.

Вот мой settings.py:

REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'dj_rest_auth.jwt_auth.JWTCookieAuthentication', ] }

REST_USE_JWT = True
JWT_AUTH_COOKIE = 'my-app-auth'
JWT_AUTH_REFRESH_COOKIE = 'my-refresh-token'

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'auth_app.middleware.MoveJWTRefreshCookieIntoTheBody'
]

и мой urls.py:

from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url, re_path

from auth_app import views

# JWT CONF
from rest_framework_simplejwt.views import (
    TokenRefreshView,
    TokenVerifyView,
)

from dj_rest_auth.registration.views import VerifyEmailView, RegisterView
from dj_rest_auth.views import PasswordResetConfirmView
from allauth.account.views import confirm_email

urlpatterns = [
    path('admin/', admin.site.urls),
    path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),
    path('token/refresh/', TokenRefreshView().as_view(), name='token_refresh'),
    path('api/protected/', views.ProtectedView.as_view(), name='protected_view'),
    path('api/open/', views.OpenView.as_view(), name='open_view'),
    # dj-rest-auth common
    path('dj-rest-auth/', include('dj_rest_auth.urls')),
    # dj-rest-auth registration
    path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')),
    path('dj-rest-auth/account-confirm-email/', VerifyEmailView.as_view(), name='account_email_verification_sent'),
    re_path(r'^account-confirm-email/(?P<key>[-:\w]+)/$', VerifyEmailView.as_view(),
     name='account_confirm_email'),
    path(
        'rest-auth/password/reset/confirm/<slug:uidb64>/<slug:token>/',
        PasswordResetConfirmView.as_view(), name='password_reset_confirm'
    ),
]

Я долгое время проверял свои решения, но все еще нет установки cookie на конечной точке обновления. Я что-то упускаю?

Я решил эту проблему!

Если кто-то в будущем будет бороться с этим, вот решение: в urls.py нужно заменить simplejwt TokenRefreshView на get_refresh_view()который принадлежит dj-rest-auth.

Другими словами, правильная конфигурация JWT такова:

# JWT CONF
from rest_framework_simplejwt.views import TokenVerifyView
from dj_rest_auth.jwt_auth import get_refresh_view
Вернуться на верх