Я пытаюсь сделать простую страницу входа с помощью Django Rest Framework и постоянно получаю ошибку токена csrf.Чтобы обойти это сейчас, я добавил аннотацию @csrf_exempt в свой метод входа, который работает, но небезопасен.
Это мой метод:
@csrf_exempt
def login(request):
print(request.COOKIES)
username = request.POST.get('username')
password = request.POST.get('password')
print("username {} password {}".format(username, password))
user = authenticate(request, username=username, password=password)
group = None
if user is not None:
django_login(request, user)
request.session.set_expiry(0)
result = True
status = 200
else:
result = False
status = 401
data = {'result': result, 'username': username}
return HttpResponse(json.dumps(data), content_type="application/json", status=status)
Настройки My Rest Framework:
REST_FRAMEWORK = {
'DATETIME_FORMAT': "%m/%d/%Y %H:%M:%S",
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.SearchFilter',
'django_filters.rest_framework.DjangoFilterBackend',
),
'EXCEPTION_HANDLER': 'common.custom_exception_handler.custom_exception_handler'
}
Без аннотации csrf_exempt
я получаю
Forbidden (CSRF token missing or incorrect.): /authentication/login
однако, когда я печатаю куки я фактически получаю токен в моем куки .
{'csrftoken': 'HZc8vPqoad...7eIvTzep', 'sessionid': 'n71c....g5c7'}
печатается, когда я снова добавляю аннотацию @csrf_exempt.
В своем угловом коде я также пытался присоединить токен csrf в качестве заголовка запроса с помощью X-CSRFToken'но я заметил две вещи
1) в моем запросе, X-CSRFToken, который я получаю из document.cookies
, НЕ совпадает с токеном выше.Существует два разных токена CSRF - почему?
Если вы заметили, заголовок X-CSRFToken и токен в файле cookie различаются.И я получаю то же самое CSRF token missing or incorrect.
2) Даже если я откажусь от использования аутентификации JWT, это не даст никакого эффекта.
Я также попытался использовать новую замену стратегии XSRF сновая стратегия Cookie в моем app.module, такая как: {
provide: XSRFStrategy,
useValue: new CookieXSRFStrategy('csrftoken', 'X-CSRFToken')
}
Но безрезультатно - я получаю ту же проблему, описанную в пункте (1).
Однако, когда я снова добавляю аннотацию @csrf_exempt
и проверяю cookie в запросе, Файл cookie на изображении обнаруживается !!
Так что мой главныйвопрос: почему DRF не может прочитать токен, хотя cookie-файл csrf является частью запроса?