如何将CSRF令牌真实性从我拥有的php应用发送到我拥有的rails应用?

如何将CSRF令牌真实性从我拥有的php应用发送到我拥有的rails应用?,php,ruby-on-rails,httprequest,csrf,sugarcrm,Php,Ruby On Rails,Httprequest,Csrf,Sugarcrm,我是sugarCRM实例的管理员,在heroku上有一个rails应用程序。如果在sugarCRM中添加联系人,我希望能够自动将联系人添加到rails应用程序。我在sugarCRM中编写了一个before_save logic_hook: function pushConts($bean, $event, $arguments) { $r = new HttpRequest('http://localhost:3000/contacts/', HttpReques

我是sugarCRM实例的管理员,在heroku上有一个rails应用程序。如果在sugarCRM中添加联系人,我希望能够自动将联系人添加到rails应用程序。我在sugarCRM中编写了一个before_save logic_hook:

    function pushConts($bean, $event, $arguments)
    {
        $r = new HttpRequest('http://localhost:3000/contacts/', HttpRequest::METH_POST);
        $r->addPostFields(array('first_name' => $bean->first_name, 'last_name' => $bean->last_name, 'phone' => $bean->phone_mobile,'email' => $bean->email1, ));
        //$r->addHeaders(array('X-CSRF-Token'=> 'testing-csrf-token');
        try
        {
            echo $r->send()->getBody();
        } catch(HttpException $ex){
            SugarApplication::appendErrorMessage("<span style='color: red; font-size: 1.8em;'>Could Not Save Contact: Rails app is down.</span>");
            $queryParams = array('module' => 'Contacts', 'action' => 'ListView');
            SugarApplication::redirect('index.php?' . http_build_query($queryParams));          
        }
函数pushConts($bean、$event、$arguments)
{
$r=新的HttpRequest('http://localhost:3000/contacts/,HttpRequest::METH_POST);
$r->addPostFields(数组('first\u name'=>$bean->first\u name,'last\u name'=>$bean->last\u name,'phone'=>$bean->phone\u mobile,'email'=>$bean->email1,);
//$r->addHeader(数组('X-CSRF-Token'=>'测试CSRF令牌');
尝试
{
echo$r->send()->getBody();
}捕获(HttpException$ex){
SugarApplication::appendErrorMessage(“无法保存联系人:Rails应用程序已关闭”);
$queryParams=array('module'=>'Contacts','action'=>'ListView');
SugarApplication::redirect('index.php?').http_build_query($queryParams));
}
当我尝试按原样发送时,rails应用程序的控制台输出为:

Started POST "/contacts/" for 127.0.0.1 at 2015-06-18 15:30:14 -0500
Processing by ContactsController#create as */*
Parameters: {"first_name"=>"contact", "last_name"=>"one", "phone"=>"(555) 555-5555", "email"=>"phone.support@example.us"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
actionpack (4.2.0) lib/action_controller/metal/request_forgery_protection.rb:181:in `handle_unverified_request'
actionpack (4.2.0) lib/action_controller/metal/request_forgery_protection.rb:209:in `handle_unverified_request'
devise (3.4.1) lib/devise/controllers/helpers.rb:251:in `handle_unverified_request'

<stack trace continues>
于2015-06-18 15:30:14-0500开始发布127.0.0.1版的“/contacts/”
由ContactsController处理#创建为*/*
参数:{“名字”=>“联系人”、“姓氏”=>“一”、“电话”=>“(555)555-5555”、“电子邮件”=>“电话”。support@example.us"}
无法验证CSRF令牌的真实性
在1ms内完成422个不可处理实体
ActionController::InvalidAuthenticationToken(ActionController::InvalidAuthenticationToken):
actionpack(4.2.0)lib/action\u controller/metal/request\u forgery\u protection.rb:181:in'handle\u unverified\u request'
actionpack(4.2.0)lib/action\u controller/metal/request\u forgery\u protection.rb:209:in'handle\u unverified\u request'
designe(3.4.1)lib/designe/controllers/helpers.rb:251:in'handle\u unverified\u request'
我知道逻辑钩子本身是有效的,因为我尝试将
skip\u-before\u-filter:verify\u-authenticity\u-token
添加到我的联系人控制器,然后它按预期工作,但出于安全原因,这不是一个可行的解决方案

正如您所看到的,我尝试发送一个带有标题的
X-CSRF-Token
,但也不起作用


我可以向这个逻辑钩子或rails应用程序本身(或两者)添加什么,以便在不影响(太多)安全性的情况下将Http请求从sugarCRM发送到rails应用程序?

rails CSRF系统实际上并不打算跨域或服务器工作

由于Rails和SugarCRM不共享用户会话,Rails不可能验证来自SugarCRM的CSRF令牌

您最好使用
skip\u before\u过滤器将其关闭,只需:[:create]

如果您需要一些真正安全的东西来验证请求是否来自您的SugarCRM服务器,那么您需要使用类似的东西

许多基于Rails的API使用一个特殊的控制器和路由来执行可由API客户端执行的操作。在您的例子中,它看起来像这样:

POST/api/v1/contacts

# routes.rb
namespace :api do
  namespace :v1 do
    resources :contacts
  end
end

# controllers/api/v1/api_controller
class ApiController < ActionController::Base
  skip_before_filter, only: [:create] 

  def authenticate
    # @todo implement token based auth
  end
end

# controllers/api/v1/contacts_controller
class Api::V1::ContactsController

  before_action :authenticate

  def create
    @contact = Contact.new(contact_params)

    # ...
  end

  # ...
end
#routes.rb
名称空间:api do
名称空间:v1 do
资源:联系人
结束
结束
#控制器/api/v1/api\U控制器
类ApicController
因此,我阅读了您链接的基于令牌的身份验证文章,如果我理解正确,我想从sugar发送HttpRequest标题中的令牌,然后我rails应用程序中的
authenticate\u或\u request\u with \u http\u token
将从HttpRequest标题接收此令牌。但是sugar如何知道正确的令牌是什么oken是吗?而且,这种基于令牌的身份验证是一种完全独立的身份验证机制吗?这意味着我必须改变所有控制器的身份验证处理方式吗?或者这就是“先跳过后过滤”的目的吗?