1

2 つの Web アプリケーション間で csrf トークンを渡して、一方の POST データをもう一方に送信しようとしています。「クライアント」アプリケーション (C) は、GET 操作を介して「サーバー」アプリケーション (S) に csrf トークンを要求します。

S は次の形式で C に応答します。

<form id='csrfRequestForm' name='csrfForm' action='http://{{ context_path }}/ajax/getcsrf' method='post'>
  <!-- csrf token -->
  {% csrf_token %}
  <!-- datas to POST follow -->
  ...
</form>

C は、データを S に POST するために、このフォームをアクション (S が使用する URL にマッピング) に送信する必要があります。C がそれを行おうとすると、csrf 検証は失敗します。GET の結果を確認したところ、csrf トークンがフォームで受信されました。django.middleware.csrf.CsrfViewMiddlewareMIDDLEWARE CLASSES の下にキーワードがリストされてsettings.pyおり、RequestContextフォームのビューをレンダリングするときに渡されますrender_to_response(... RequestContext(request))

私は何を間違っていますか?ありがとう

4

3 に答える 3

1

コンテキストを定義して、次のように返してみてください...

context = RequestContext(request, {
  'request': request
})

return render_to_response(..., context_instance=context)
于 2012-09-24T16:25:48.087 に答える
1

これは仕様によるもので、クロスサイト POST 実行を許可しません。あなたが持っている1つのオプションは、djangoのドキュメントに従って、実行できるようにしたいメソッドを安全にマークすることです:

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

于 2012-09-24T17:44:33.893 に答える
0

私はあなたの方法でそれを解決できませんでしたが、私はそれを行う方法を管理しました:

C は、ポップアップを開く JavaScript 経由で S に直接移動します。

window.open("http://<S_address>/<path_to_request_form>");

このようにして、サードパーティの認証サーバーを介してログに記録された C を使用しているユーザー (以前に言及するのを忘れていました、申し訳ありません) は、S のポップアップ ウィンドウに引き続きログインし、正しい csrf トークンを含むフォームを受け取ります。それが正しいかどうかはわかりませんが、うまくいきます。御時間ありがとうございます

于 2012-09-25T15:10:31.637 に答える