65

mod_wsgiを使用してApacheサーバー上でdjangoを実行しているだけでなく、djangoではなくapacheによって直接提供されるangularjsアプリもあります。django サーバー (rest_framework を実行) に対して POST 呼び出しを行いたいのですが、csrf トークンに問題があります。

{% csrf token %}テンプレートの一部として配置せずにサーバーからトークンを設定する方法はありますか (これらのページは django を経由しないため)。

  1. GET リクエストで csrf トークンを Cookie として取得できるようにしたいと考えています。
  2. csrfトークンCookie値を使用して、djangoサーバーにPOSTリクエストを送信できるようにしたいと考えています。
4

5 に答える 5

112

Django と AngularJS はどちらもすでに CSRF をサポートしています。あなたの部分は非常に単純です。

まず、Django で CSRF を有効にする必要があります。すでに有効になっていると思います。そうでない場合は、Django のドキュメントhttps://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajaxに従ってください。

これで、Django は最初の GET リクエストで指定された Cookie を設定し、その後の POST/PUT/DELETE リクエストでcsrftokenカスタム HTTP ヘッダーを期待します。X-CSRFToken

Angular の場合、名前付きの Cookie を想定し、ヘッダーでXSRF-TOKENPOST/PUT/DELETE リクエストをX-XSRF-TOKEN実行するため、この 2 つを相互に連携させるには少し調整する必要があります。

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';

上記の 2 行を js コードのどこかに追加します。module.config() ブロックはこれに適した場所です。

それでおしまい。

注:これは angular 1.1.5 用です。古いバージョンでは別のアプローチが必要になる場合があります。

アップデート:

angular アプリは django によって提供されないため、cookie を設定できるようにするには、最初に angular アプリが django に対して GET 要求を行う必要があります。

于 2013-08-09T22:45:08.943 に答える
60
var foo = angular.module('foo', ['bar']);

foo.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);

そして、$http が使用されているすべてのモジュールのサービスとコントローラーは、csrf トークンを使用してリクエストを送信します。

于 2013-10-20T08:39:46.953 に答える
11

周りを検索した後、私にとってうまくいったのは、次のコードを含むこの投稿からのものでした:

angular.module( '[your module name]',
    ... [some dependencies] ...
    'ngCookies',
    ... [other dependencies] ...
)
.run( function run( $http, $cookies ){

    // For CSRF token compatibility with Django
    $http.defaults.headers.post['X-CSRFToken'] = $cookies.get('csrftoken');
})

これはもちろん、django サーバーからの GET リクエストを通じて Cookie を取得した後です。

Ye Liunのものも含め、ここで他のいくつかの回答も調べましたが、$ httpProviderのxsrfのデフォルトオプションへの変更を指定する公式ドキュメントには何も見つかりませんでした。この投稿を書いている時間。

于 2013-08-10T06:24:54.287 に答える