別の開発者によって構築された新しい 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 と認証の両方に慣れていないので、暗闇の中で撮影していて、誰かが時間を節約してくれることを願っています。私の質問は次のとおりです。
- これはできますか?
- これを行う必要がありますか?そうでない場合、他にどのようなオプションがありますか?
- ある投稿では、認証を回避する方法が提案されましたが、メインの 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 の行をコメントアウトすればうまくいくので、偽造防止は間違いなく問題です。私はそれを解決する方法がわかりません。