首页 文章

Rails,OAuth和CSRF保护

提问于
浏览
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,但这对我现在没有帮助 .

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

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

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

  • 覆盖Rails CSRF保护以忽略OAuth请求 . 我没有试过这个,但似乎应该可以更改其中一个钩子(可能是 verify_authenticity_token 过滤器)来考虑成功的OAuth请求 .

有没有人遇到这个?有什么建议?或者我可能遗漏了一些基本的东西?

1 回答

  • 5

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

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

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

相关问题