Угловой токен 5 Django CSRF - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь сделать простую страницу входа с помощью 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 - почему?

enter image description here

Если вы заметили, заголовок 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 является частью запроса?

...