Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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 导轨、OAuth和CSRF保护_Ruby On Rails_Json_Rest_Oauth_Csrf - Fatal编程技术网

Ruby on rails 导轨、OAuth和CSRF保护

Ruby on rails 导轨、OAuth和CSRF保护,ruby-on-rails,json,rest,oauth,csrf,Ruby On Rails,Json,Rest,Oauth,Csrf,我正在使用REST和OAuth与Rails应用程序(来自iPhone应用程序,但这不应该相关)。然而,我在Rails的CSRF保护方面遇到了一些问题(通过防止伪造) 我知道CSRF保护只适用于常规表单提交(即Content Type=application/x-www-form-urlencoded),因此如果我提交的是JSON或XML数据,就可以了。不幸的是,OAuth目前仅限于application/x-www-form-urlencoded请求。有一个问题,但这对我现在没有帮助 在我看来,

我正在使用REST和OAuth与Rails应用程序(来自iPhone应用程序,但这不应该相关)。然而,我在Rails的CSRF保护方面遇到了一些问题(通过
防止伪造)

我知道CSRF保护只适用于常规表单提交(即Content Type=application/x-www-form-urlencoded),因此如果我提交的是JSON或XML数据,就可以了。不幸的是,OAuth目前仅限于application/x-www-form-urlencoded请求。有一个问题,但这对我现在没有帮助

在我看来,我有以下选择:

  • 将数据作为JSON发送,知道它不是OAuth签名的一部分,因此会受到中间人攻击。显然不是一个有吸引力的解决方案

  • def verify_authenticity_token
      verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
    end
    
  • 创建特殊的Rails操作(例如,
    UsersController\update\uOAuth
    ),在内部委托给常规操作(例如,
    UsersController\update
    )。然后将其从伪造保护中排除(
    保护\u免受伪造:仅=>[:更新]
    )。这应该是可行的,对于一个或两个行动来说可能是可以接受的,但显然是一个非常混乱的解决方案

  • def verify_authenticity_token
      verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
    end
    
  • 覆盖Rails CSRF保护以忽略OAuth请求。我没有尝试过,但是似乎应该改变一个钩子(也许是<代码> ViFilyAuthTimeTythToigs<代码>过滤器)来考虑OAuthe请求成功。


  • 以前有人碰到过这个吗?有什么建议吗?或者我可能缺少一些基本的东西?

    我会回答我自己的问题。:)

    我在OAuth控制器扩展中添加了以下方法。这在默认实现之上添加的唯一内容是
    oauth?
    检查。这似乎起到了作用,感觉是一个非常干净的解决方案

    def verify_authenticity_token
      verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
    end