Проверка Django Framework CSRF завершилась неудачей с ошибкой 403 Forbidden. Запрос прерван для скрипта Python, отличногPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проверка Django Framework CSRF завершилась неудачей с ошибкой 403 Forbidden. Запрос прерван для скрипта Python, отличног

Сообщение Anonymous »

Я использую Django Framework с DRF для создания API на серверной стороне. Я использую скрипт Python как отдельное приложение на базе Windows для получения и отправки данных на внутренний сервер, которым является Django. Это не HTML-приложение, и в нем не используются файлы cookie. Он просто запускает скрипт Python с библиотекой запроса. Я также использую токен аутентификации JWT для защиты своих запросов на сервер. При отправке запроса на получение токена на сервер я получаю следующую ошибку:
Проверка CSRF не удалась. Запрос прерван.
Вы видите это сообщение, потому что этому сайту требуется файл cookie CSRF при отправке форм. Этот файл cookie необходим из соображений безопасности, чтобы гарантировать, что ваш браузер не будет взломан третьими лицами.
Если вы настроили свой браузер на отключение файлов cookie, включите их, по крайней мере, повторно. для этого сайта или для запросов «того же происхождения».
Причина ошибки: файл cookie CSRF не установлен.
Мой файл 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)

Мой файлview.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-приложение, мне интересно, как защитить мои запросы.

Подробнее здесь: https://stackoverflow.com/questions/790 ... quest-abor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»