1. ホーム
  2. ruby-on-rails-3

[解決済み] rails - json deviseリクエストで「WARNING: Can't verify CSRF token authenticity」。

2023-06-19 19:17:41

質問

JSONリクエストで渡すCSRFトークンを取得するにはどうすればよいですか?

セキュリティ上の理由から RailsはCSRFトークンをチェックしています をチェックします。

コントローラーに skip_before_filter :verify_authenticity_token と書くこともできますが、CRSFの保護がなくなります(お勧めできません :-) )。

この類似の(まだ受け入れられていない) 回答 を示唆しています。

でトークンを取得する。 <%= form_authenticity_token %>

問題は、どのようにするかということです。トークンを取得するために、私のページのいずれかに最初の呼び出しを行い、それからDeviseで本当の認証を行う必要があるのでしょうか?それとも、サーバーから取得できる一回限りの情報で、(サーバー自体で手動で変更するまで)一貫して使用するのでしょうか?

どのように解決するのですか?

編集 :

Rails 4では、下のコメントで@genkilabsが提案しているものを使っています。

protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }

これは、内蔵されたセキュリティを完全にオフにするのではなく、CSRF トークンなしでサーバーに何かがヒットしたときに、存在する可能性のあるセッションを停止させるものです。


skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }

これは、適切にマークされたjson投稿/入力のCSRFチェックをオフにするものです。

例えば、iOS では NSURLRequest に以下を設定します。"parameters" はあなたのパラメータです。


[request setHTTPMethod:@"POST"];

[request setValue:@"application/json" 
       forHTTPHeaderField:@"content-type"];

[request setValue:@"application/json" 
       forHTTPHeaderField:@"accept"];

[request setHTTPBody:[NSData dataWithBytes:[parameters UTF8String] 
                                            length:[parameters length]]];