4

Windows Phone 8 SDK の phonegap 2.3.0 を使用して、iframe を介して読み込まれる webapp があります。iframe を介してロードする際の問題は、リクエストCan't verify CSRF token authencityを送信したときに Rails 側で発生することです。$.post()

$.post()使用$.ajax()するsetHeaderRequestをトークンで上書きするなど、いくつかのアプローチを試しました。また、$.ajaxSetup()

protect_from_forgeryまたはを無効にするverify_authenticity_tokenと、アプリが正しく読み込まれます。

webapp が別のドメインにあり (クロスドメインの問題)、csrf が単にクリックジャッキングを防ごうとしているために問題が発生していると思います。この問題を回避する方法はありますか?

これが私が投稿している方法の例です:

    $.post(url, {app: {played: tiles}, no: no}, function (response) {
      linkTo('#app_button', response['next']);
    });

例:

    $.ajaxSetup({
      beforeSend: function(xhr) {
        xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').prop('content'));
      }
    });

編集:同じエラーで、認証トークンをパラメーターとして投稿リクエストに渡すことができました。エラーの原因がトークンではないと信じ始めています。エラーが発生する他の理由は何ですか?

ログ:

[2539 - 2013/03/06 15:37:42] (INFO)   Parameters: {"app"=>{"played"=>"tiles"}, "no"=>"no", "authenticity_token"=>"yBpUImzjtKGIejh/WCekv/GCi1zjPirib22plqfLJ1Y="}
[2539 - 2013/03/06 15:37:42] (WARN) WARNING: Can't verify CSRF token authenticity
[2539 - 2013/03/06 15:37:42] (INFO) User agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)
[2539 - 2013/03/06 15:37:42] (DEBUG)   User Load (1.8ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
[2539 - 2013/03/06 15:37:42] (DEBUG)   CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
[2539 - 2013/03/06 15:37:42] (DEBUG)   CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
[2539 - 2013/03/06 15:37:42] (WARN) Lost session [118.143.97.82] (/locations/1/games) - Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)
[2539 - 2013/03/06 15:37:42] (DEBUG)   CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
4

5 に答える 5

3

答えは、セッション ストレージをブロックしていた P3P ヘッダーがないためです。これを修正するには、P3P ヘッダーを追加する必要があります。

于 2013-03-20T04:12:54.910 に答える
1

特定のコントローラー アクションに対して CSRF をオフにすることができます。AJAX 呼び出しの目的で新しいアクション (iframe としましょう) を作成し、コントローラーに追加できます。

skip_before_filter :verify_authenticity_token,  :only => [:iframe]
于 2013-03-06T05:51:54.647 に答える
0

@ user1555300の答えは、詳細を提供するだけです。

これapplication_controller.rbを上に追加して

before_filter :set_p3p

このメソッドも追加します

private 
# for IE, Facebook, and iframe sessions
def set_p3p
  headers['P3P'] = 'CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV"'
end

application_controller.rbこれが通常のコントローラーではないことを確認してください。

于 2015-07-25T01:55:18.363 に答える