2

別の開発者によって構築された新しい Web アプリがあります。私の仕事は、他のプログラムが XML データをデータベースと交換するために使用するバックエンド API を実装することでした。メインアプリがユーザーを認証するための工夫を実装するまで、それはかなりうまくいっていました。curl コマンドを微調整してログインし、データを送信/要求できると思っていましたが、うまくいきません。私は次のようなことを試しています

curl --cookie-jar ~/Desktop/cjar --data "user[login]=<username>" --data "user[password]=<pwd>" --data "commit=Sign in" localhost:3000/users/sign_in

に続く

curl --cookie ~/Desktop/cjar --data "<root_node></root_node>" localhost:3000/my_update_method

私の最新のエラーメッセージは

WARNING: Can't verify CSRF token authenticity
Completed 401 Unauthorized in 1ms

これは、私が受け取っていたリダイレクト メッセージよりも優れていると思いますが、何が起こっているのかはまだわかりません。

これは一部はdeviseに関連しており、一部はRailsによる自動認証に関連していると思わせる関連投稿をいくつか見つけました。Web ページから渡された情報を見ると、curl コマンドの作成方法がわからない Authenticity_token と utf8 パラメータが表示されます。

いろいろ試してみることはできますが、curl と認証の両方に慣れていないので、暗闇の中で撮影していて、誰かが時間を節約してくれることを願っています。私の質問は次のとおりです。

  1. これはできますか?
  2. これを行う必要がありますか?そうでない場合、他にどのようなオプションがありますか?
  3. ある投稿では、認証を回避する方法が提案されましたが、メインの Web アプリに影響を与えずに、curl コマンドだけが login/pwd を要求し、他の検証をバイパスすることは可能ですか?

更新 1:

すべての助けをありがとう、私はそれを感謝します。最初の curl コマンド (上記) への応答は、ログイン ページへのリダイレクトにすぎないため、ログインに時間がかからないようです。デバッグを開始する場所について何か提案はありますか? アプリケーションには何も入っていないので、そこにはログがありません。これが誰かにとって何かを意味する場合、Cookie の内容は次のとおりです。

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_localhost FALSE   /   FALSE   0   _glow_session   BAh7B0kiCmZsYXNoBjoGRUZvOiVBY3Rpb25EaXNwxhc2g6OkZsYXNoSGFzaAk6CkB1c2VkbzoIU2V0BjoKQGhhc2h7ADoMQGNsb3NlZEY6DUBmbGFzaGVzewY6C25vdGljZUkiHFNpZ25lZCBpbiBzdWNjZXNzZnVsbHkuBjsAVDoJQG5vdzBJIg9zZXNzaW9uX2lkBjsARkkiJTIwODc1Y2VjM2ViNzlmZDE3ZjA4ZjVmMDAxNWMxMDU4BjsAVA%3D%3D--d90722b6da386630b33f57902447b440f30d0b2a

API リクエストを処理するコントローラーに追加skip_before_filter :verify_authenticity_tokenしたところ、以前に発生していたエラーが解消されました。

更新 2:

トラブルシューティングとデバッグを行った後、実際には問題なくログインできていると思いますが、2 回目の curl を実行すると、development.log ファイルに次のように表示されます。

Started POST "/upsert_experiment" for 127.0.0.1 at 2013-10-16 12:14:12 -0500
Processing by WebServiceController#upsert_experiment as */*
  Parameters: {"experiment_xml"=>"<experiment></experiment>"}
Completed 401 Unauthorized in 1ms

これは、承認がまだ問題であると私に思わせます。

更新 3:

問題はそれが機能していないことだと思いますskip_before_filter :verify_authenticity_token

私は持っている

class ApplicationController < ActionController::Base
  rescue_from DeviseLdapAuthenticatable::LdapException do |exception|
    render :text => exception, :status => 500
  end
  protect_from_forgery
  before_filter :authenticate_user!
end

class WebServiceController < ApplicationController
  skip_before_filter :verify_authenticity_token
  ...
end

この設定で「Completed 401 Unauthorized in 1ms」となります。スーパークラスの protect_from_forgery の行をコメントアウトすればうまくいくので、偽造防止は間違いなく問題です。私はそれを解決する方法がわかりません。

4

3 に答える 3

2

CSRF トークンがありません。これは、クロスサイト リクエスト フォージェリを防ぐためです。

于 2013-10-15T20:34:06.027 に答える
2

CSRF は Cross Site Request Forgery の略で、セキュリティ保護機能です。詳細については、こちらを参照してください。基本的に、レールはページにレンダリングされたフォームに含まれるランダムなトークンを生成し、フォームの送信時にそのトークンを取得することを期待しています。この保護は API には必要ありませんが、Web アプリ側にとっては重要です。CSRF トークンを無効にする方法については、この質問を参照してください。

1 つのアプローチとして、token_authenticableDevise モジュールを使用してリクエストを認証しauth_token=#{token}、認証トークンが存在する場合は CSRF 保護をスキップすることが考えられます。

于 2013-10-15T20:35:09.080 に答える
2

Rails CSRF 保護により、このリクエストを行うことができません。

レールのドキュメントから

CSRF protection automatically include a security token, calculated from the current session and the server-side secret, in all forms and Ajax requests generated by Rails. You won't need the secret, if you use CookieStorage as session storage. If the security token doesn't match what was expected, the session will be reset. Note: In Rails versions prior to 3.0.4, this raised an ActionController::InvalidAuthenticityToken error.

スキップしたい場合は、この行をコントローラーに追加してください

skip_before_action :verify_authenticity_token, :only => ["your_update_action"]
于 2013-10-15T20:36:36.323 に答える