2009-12-03 92 views
5

我使用REST和OAuth跟一个Rails应用程序(从一个iPhone应用程序,但不应该是相关的)。但是,我遇到了一些Rails的CSRF保护问题(通过protects_from_forgery)。我知道CSRF保护只针对常规表单提交(即Content-Type = application/x-www-form-urlencoded),所以如果我提交JSON或XML数据,我会好起来的。不幸的是,OAuth目前仅限于application/x-www-form-urlencoded请求。有一个draft spec that extends OAuth to non-form-urlencoded data,但这现在没有帮助我。轨,OAuth的,和CSRF保护

我看到它的方式,我有以下选择:

  1. 发送数据作为JSON,知道它不会是OAuth的签名的组成部分,因而受人在the-中等攻击。显然不是一个有吸引力的解决方案。

  2. 创建内部委托给常规操作的特殊Rails动作(例如UsersController#update_oauth)(例如UsersController#update)。然后从伪造保护中排除这些(protects_from_forgery :only => [:update])。这应该起作用,并且对于一两个动作可能是可以接受的,但显然这将是一个非常混乱的解决方案。

  3. 重写Rails CSRF保护以忽略OAuth请求。我还没有尝试过,但似乎应该可以更改其中一个挂钩(可能是verify_authenticity_token过滤器),以便将OAuth请求视为成功。

有没有人碰到过这个?任何建议?或者我可能错过了一些基本的东西?

回答

5

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

我将以下方法添加到我们的OAuth控制器扩展。在默认实现上增加的唯一东西是oauth?检查。这似乎是一个窍门,感觉就像一个非常干净的解决方案。

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