Django Framework CSRF-проверка не удалась с ошибкой 403 Forbidden. Запрос прерван для не-HTML скрипта на питоне
Я использую Django Framework с DRF для создания API на бэкенде. Я использую скрипт python в качестве автономного приложения на базе windows для получения и отправки данных на внутренний сервер, который является Django. Это не HTML-приложение, и никакие Cookies не задействованы. Это просто выполнение скрипта python с библиотекой "request". Я также использую токен аутентификации JWT для защиты моих запросов к серверу. При выполнении запроса на получение токена на сервер я получаю следующую ошибку:
Проверка CSRF не удалась. Запрос прерван.
Вы видите это сообщение, потому что этот сайт требует CSRF-куки при отправке форм. Этот файл cookie необходим в целях безопасности, чтобы убедиться, что ваш браузер не взломан третьими лицами.
Если вы настроили свой браузер на отключение cookies, пожалуйста, включите их снова, по крайней мере, для этого сайта или для запросов "того же происхождения".
Причина отказа: CSRF cookie не установлен.
Мой файл Settings.py выглядит следующим образом:
MIDDLEWARE = [
'autobiz.middleware.WebSocketMiddleware',
'django_tenants.middleware.main.TenantMainMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
"corsheaders.middleware.CorsMiddleware",
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_METHODS = [
"DELETE",
"GET",
"OPTIONS",
"PATCH",
"POST",
"PUT",
]
CORS_ALLOW_HEADERS = [
"accept",
"accept-encoding",
"authorization",
"content-type",
"dnt",
"origin",
"user-agent",
"x-csrftoken",
"x-requested-with",
REST_FRAMEWORK={
'DEFAULT_FILTER_BACKENDS':['django_filters.rest_framework.DjangoFilterBackend', ],
# 'DEFAULT_AUTHENTICATION_CLASSES':[ 'rest_framework.authentication.BasicAuthentication','rest_framework.authentication.TokenAuthentication','rest_framework.authentication.SessionAuthentication',],
'DEFAULT_AUTHENTICATION_CLASSES':['rest_framework_simplejwt.authentication.JWTAuthentication',],
'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAdminUser', 'rest_framework.permissions.IsAuthenticated',],
}
Мой urls.py выглядит следующим образом:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('abpublic.urls'), name='index'),
path('api/token/', csrf_exempt(jwt_views.TokenObtainPairView.as_view()), name='token_obtain_pair'),
path('api/token/refresh/', csrf_exempt(jwt_views.TokenRefreshView.as_view()), name='token_refresh'),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Мой файл views.py выглядит следующим образом:
class UsersViewSet(viewsets.ModelViewSet):
queryset = Users.objects.all()
serializer_class = UsersSerializer
permission_classes = (IsAuthenticated,)
filterset_fields = ['empid', 'password', 'type', 'reporting_to', 'role', 'active', 'last_login_date',
'last_created_date',
'last_login_time', 'last_created_time', 'joindate', 'leavedate', ]
Теперь в скрипте python я сначала пытаюсь получить токен, а затем предоставить его в качестве заголовка к запросу. Но при генерации токена я сталкиваюсь с проблемой.
# Request the token
token_response = requests.post(tenant + "api/token/", data=credentials)
# Check if the request was successful
if token_response.status_code == 200:
tokens = token_response.json()
access_token = tokens.get('access') # The access token
print(access_token)
refresh_token = tokens.get('refresh') # The refresh token
else:
print('Failed to obtain token:', token_response.status_code, token_response.text)
access_token = None
# Token has changed, split the token into its components
token_parts = token.split('#')
if len(token_parts) != 6:
print("Invalid token format")
continue
Я пробовал искать и применять некоторые решения, как показано ниже:
path('api/token/', csrf_exempt(jwt_views.TokenObtainPairView.as_view()), name='token_obtain_pair'),
Также попробовал добавить,
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
Но ни одно решение не помогает. Поскольку это не HTML-приложение, мне интересно, как защитить мои запросы.