2017-07-28 8 views
0

Django 1.4.3からDjango 11.3にアップグレードしています。csrftokenのクッキーはなぜ機能しますか?

私は2つの異なる形式のウェブページを持っています。どちらの形式にも{%csrf_token%}がロードされています。フローは、ユーザーがフォーム1(ajax)を使用してログインした後、2番目のフォームが表示されます。ユーザーは、2番目のフォームにデータを入力し、ajaxを使用して送信します。今、私は(ジャンゴ1.4.3の下で働いていた)なかった場合、この要求は失敗しました -

csrfmiddlewaretoken = $form.find('input[name="csrfmiddlewaretoken"]').val(); 

を今、私はクッキーからcsrftoken値を取得し、AJAXの一部としてクッキーを送信していますこの問題を解決するために、それが動作します -

csrfmiddlewaretoken = _getHelperCookie('csrftoken'); 

クライアントクッキーを取得するのがなぜ難しいですか?ログイン後、Djangoはrotate_tokenを呼び出します。これは実際に何が影響を及ぼしますか?

答えて

1

あなたが言うように、Djangoはセキュリティ対策としてログインするときにCSRFトークンをローテーションします。これはstarted in Django 1.5.2です。

あなたはajaxリクエストでログインしているので、古いトークンはまだhtmlにあります。 htmlからトークンをフェッチすると、古いトークンを使用しているので、CSRFエラーが発生します。

クッキーからトークンをフェッチすると、新しいトークンが取得されるため、エラーを回避できます。