Ruby on rails 使用curl访问实现designe的Rails应用程序的后端API
我们有一个由另一个开发人员构建的新web应用程序。我的工作是为其他程序实现一个后端API,用于与数据库交换XML数据。在主应用程序实现Desive以验证用户身份之前,一切都进行得很顺利。我想我可以调整curl命令来登录,然后提交/请求数据,但进展不太顺利。我在尝试像这样的事情Ruby on rails 使用curl访问实现designe的Rails应用程序的后端API,ruby-on-rails,ruby,api,curl,devise,Ruby On Rails,Ruby,Api,Curl,Devise,我们有一个由另一个开发人员构建的新web应用程序。我的工作是为其他程序实现一个后端API,用于与数据库交换XML数据。在主应用程序实现Desive以验证用户身份之前,一切都进行得很顺利。我想我可以调整curl命令来登录,然后提交/请求数据,但进展不太顺利。我在尝试像这样的事情 curl --cookie-jar ~/Desktop/cjar --data "user[login]=<username>" --data "user[password]=<pwd>" --da
curl --cookie-jar ~/Desktop/cjar --data "user[login]=<username>" --data "user[password]=<pwd>" --data "commit=Sign in" localhost:3000/users/sign_in
我想这比我收到的重定向消息要好,但我仍然不知道发生了什么
我发现了一些相关的帖子,让我觉得这部分与Desive有关,部分与Rails完成的自动身份验证有关。当我查看网页传递的信息时,我看到了我不知道如何为curl命令构造的authenticity_标记和utf8参数
我可以继续尝试一些东西,但我对卷发和身份验证都是新手,所以我在黑暗中拍摄,希望有人能帮我节省一些时间。我想我的问题是:
# 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\u before\u filter:verify\u authenticity\u token
,这消除了我以前看到的错误
更新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
及
class WebServiceController
通过这种设置,我可以“在1毫秒内完成”。如果我在超类中注释掉protect_from_forgery行,它就起作用了,所以伪造保护肯定是个问题。我只是不知道如何解决它。您丢失了一个CSRF令牌。这是为了防止跨站点请求伪造。CSRF代表跨站点请求伪造,是一种安全保护,您可以阅读更多信息。本质上,rails生成一个随机令牌,该令牌包含在页面上呈现的表单中,它希望在表单提交时获得该令牌。api不需要这种保护,但它对web应用程序端很重要。有关禁用CSRF令牌的方法,请参阅 您可能采取的一种方法是使用
token\u authenticable
设计模块,并使用auth\u token={token}
对您的请求进行身份验证,然后在存在auth token的情况下跳过CSRF保护。Rails阻止您发出此请求
来自rails文档
CSRF保护自动包括一个安全令牌,该令牌根据当前会话和服务器端机密以各种形式计算,并由Rails生成Ajax请求。如果使用CookieStorage作为会话存储,则不需要这个秘密。如果安全令牌与预期的不匹配,会话将被重置。注意:在3.0.4之前的Rails版本中,这引发了ActionController::InvalidAuthenticationToken错误。
如果要跳过它,请将此行添加到控制器
skip_before_action :verify_authenticity_token, :only => ["your_update_action"]
这看起来很有希望!是否仍然需要curl命令来指定登录/密码?另外,指定多个豁免操作的最佳方法是什么?您仍然需要指定用户名/密码
skip\u before\u action:verify\u authenticity\u token,:except=>[“action1”,“action2”]
我收到了这个错误:路由错误未定义的方法在应用程序的操作之前skip\u controller:Class尝试运行rake routes
以了解有关可用路由的更多信息 我在应用程序控制器中有这样一行:skip\u before\u action:verify\u authenticity\u token,:except=>[:upsert\u experiment,:upsert\u workflow]
我还尝试了将两个方法名都用引号括起来,而不是作为符号,但我得到了相同的错误。我会在早上查看文档,但是如果您看到明显的问题,请随时告诉我。再次感谢。请尝试skip\u before\u filter
删除错误,但我仍然无法登录(请参阅OP中的编辑)。我不确定通过Rails应用程序发出请求是什么意思。如果不是通过curl,另一个应用程序将如何访问Rails应用程序。对不起,哇,我只是误解了这个问题。
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
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
skip_before_action :verify_authenticity_token, :only => ["your_update_action"]