我们有一个由另一个开发人员构建的新 Web 应用程序。我的工作是为其他程序实现一个后端 API,用于与数据库交换 XML 数据。它进展顺利,直到主应用程序实现了对用户进行身份验证的设计。我想我可以调整 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
我想这比我收到的重定向消息要好,但我仍然不知道发生了什么。
我发现一些相关的帖子让我认为这部分与设计有关,部分与 Rails 完成的自动身份验证有关。当我查看网页传递的信息时,我看到了我不知道如何为 curl 命令构建的authenticity_token 和utf8 参数。
我可以继续尝试,但我对 curl 和身份验证都是新手,所以我有点在黑暗中拍摄,希望有人能帮我节省一些时间。我想我的问题是:
- 这可以做到吗?
- 应该这样做吗?如果没有,我还有什么其他选择?
- 一篇文章提出了一种绕过身份验证的方法,但是否可能只有 curl 命令需要登录/密码,但绕过任何其他验证,而不影响主 Web 应用程序?
更新 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
我已经添加skip_before_filter :verify_authenticity_token
到处理 api 请求的控制器中,这消除了我之前看到的错误。
更新 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
使用此设置,我得到“在 1 毫秒内完成 401 未授权”。如果我在超类中注释掉protect_from_forgery 行,它就可以工作,所以伪造保护肯定是问题所在。我只是不知道如何解决它。