2017-08-20 20 views
0

私はログインフォームとPOST AJAXリクエストを使って提出するモーダルを行いました。私はログアウトしてログインしようとすると、私は再びAJAX要求のエラーメッセージがあり、1時間にログインすることができ、この(CSRFに失敗しました)AJAXは一度しか動作しません

Prohibido (403) 
Verificación CSRF fallida. Solicitud abortada 

私はF5キーを押して、ページ全体を更新する場合はログインが唯一再び動作します。ログインが成功した後、私はページ全体ではなく、ヘッダーだけをリフレッシュします。私はCSRFトークンのみ成功要求の後に1時間に動作することを発見し

$('#update-' + idToUpdate).load(' #' + idToUpdate); 

EDIT:私のリフレッシュコードはこれです。私はフォームが再び動作するように新しいトークンを生成しなければならず、このトークンはF5キーを押してページ全体をリフレッシュすると更新されます。

この問題の解決方法を教えてください。私はCSRFトークンを更新するためのAJAX要求をしたくない、それは安全ではない。

+0

あなたはCSRFトークンの正確な作成方法についてお聞かせください。それはテンプレート変数を介してですか、またはドキュメントに記載されているjs関数を介してですか? https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax –

+0

'

{%csrf_token%}'これはDjangoの仕組みです。これはトークンで隠された入力と等価です。 – Jota

答えて

0

解決策が見つかりました。成功リクエスト後、CSRFトークンを含むフォームのすべてのIDを関数$('#update-' + idToUpdate).load(' #' + idToUpdate);に挿入します。これにより、フォームの部分的な非同期F5リフレッシュが行われるため、すべてのCSRFトークンが更新され、新しいリクエストを実行できます。

0

あなたはJS自体によってCSRFトークンを生成することができます

// using jQuery 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 

これはトークン毎回関数を呼び出すと、あなたはページを更新する必要はありません新しいCSRFを作成します。

詳細については、https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax

+0

そのコードは現在のCSRFトークンの値を取りますが、リフレッシュしたり新しいトークンを作成することはありません。私は公式の文書からそのコードを試しましたが、うまくいきません。 このコードの目的は、公式文書に現れている他のものと一緒に、クッキーからトークンの現在の値を取得し、それをajaxリクエストのヘッダに挿入することです。新しい成功リクエストを送信するには、トークンをリフレッシュする必要があります。 – Jota

関連する問題