30

RailsでAngularJSを使用しています。ユーザーを一括更新する次のリクエストがあります。

 $http{
    method: 'POST',
    url: $scope.update_url,
    params: {selected_ids: userIds}
 }

URL の長さの制限により、これは 'GET' 要求にすることはできません (http://support.microsoft.com/kb/208427)

ただし、「POST」リクエストの場合、ヘッダーに CSRF 認証トークンが必要です。

CSRF トークンをポスト リクエスト ヘッダーに設定するにはどうすればよいですか?

4

3 に答える 3

68

$httpサービスで説明されているように、http ヘッダーを設定できます。

グローバルに設定できます。

$httpProvider.defaults.headers.post['My-Header']='value'   (or)
$http.defaults.headers.post['My-Header']='value';

または単一のリクエストの場合:

$http({
   headers: {
      'My-Header': 'value'
   }  
});

Angularからの重要な引用を次に示します。

クロス サイト リクエスト フォージェリ (XSRF) 保護 XSRF は、許可されていないサイトがユーザーの個人データを取得できる手法です。Angular は、XSRF に対抗するために次のメカニズムを提供します。XHR リクエストを実行するとき、$http サービスは XSRF-TOKEN と呼ばれる Cookie からトークンを読み取り、それを HTTP ヘッダー X-XSRF-TOKEN として設定します。ドメインで実行されている JavaScript のみが Cookie を読み取ることができるため、サーバーは、XHR がドメインで実行されている JavaScript からのものであることを保証できます。

これを利用するには、サーバーは、最初の HTTP GET 要求で、XSRF-TOKEN と呼ばれる JavaScript 読み取り可能なセッション Cookie にトークンを設定する必要があります。後続の非 GET 要求で、サーバーは Cookie が X-XSRF-TOKEN HTTP ヘッダーと一致することを確認できるため、ドメインで実行されている JavaScript のみがトークンを読み取ることができることを確認できます。トークンはユーザーごとに一意である必要があり、サーバーによって検証可能である必要があります (JavaScript が独自のトークンを作成しないようにするため)。トークンは、セキュリティを強化するためにソルトを使用したサイトの認証 Cookie のダイジェストにすることをお勧めします。

于 2013-01-01T11:39:44.683 に答える
0

私は最近同じ問題に直面し、gem angular_rails_jsを追加することで解決しました。私の理解では、すべてのレールコントローラーに対して、angular $http によってキャッチされる (デフォルトの $http 動作) レール CSRF-TOKEN を持つ Cookie が作成されます。

于 2015-12-17T10:56:21.547 に答える