Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用curl访问实现designe的Rails应用程序的后端API_Ruby On Rails_Ruby_Api_Curl_Devise - Fatal编程技术网

Ruby on rails 使用curl访问实现designe的Rails应用程序的后端API

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

我们有一个由另一个开发人员构建的新web应用程序。我的工作是为其他程序实现一个后端API,用于与数据库交换XML数据。在主应用程序实现Desive以验证用户身份之前,一切都进行得很顺利。我想我可以调整curl命令来登录,然后提交/请求数据,但进展不太顺利。我在尝试像这样的事情

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参数

我可以继续尝试一些东西,但我对卷发和身份验证都是新手,所以我在黑暗中拍摄,希望有人能帮我节省一些时间。我想我的问题是:

  • 这能做到吗
  • 应该这样做吗?如果没有,我还有什么其他选择
  • 一篇帖子建议了一种绕过身份验证的方法,但是只有curl命令可能需要登录/pwd,但可以绕过任何其他验证,而不影响主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
    
    我已经向处理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"]