设计令牌身份验证无法验证CSRF令牌真实性

时间:2016-08-24 20:20:59

标签: ruby-on-rails ruby authentication devise

我尝试在rails中创建app,这将是常规Web应用程序,也是用native native编写的移动应用程序的api。我利用"设计令牌身份验证"宝石沿着#34;设计"。 我向Gemfile添加了gems并运行了bundle。接下来我跑了 rails g devise_token_auth:install User auth。最后我改变了路线:

Rails.application.routes.draw do
  devise_for :users

  namespace :api do
    scope :v1 do
      mount_devise_token_auth_for 'User', at: 'auth'
    end
  end
end

幸运的是,常规sign_in和sign_up适用于网络应用,但是当我尝试使用curl向api发送请求时:

curl -H "Content-Type: application/json" -X POST -d '{"email":"test123@gmail.com","password":"aaaaaaaa"}' http://localhost:3000/api/v1/auth/sign_in

我收到消息"无法验证CSRF令牌的真实性"

2 个答案:

答案 0 :(得分:1)

CSRF令牌真实性检查源自您的Rails应用程序控制器。

# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception

您可以通过多种方式处理这种情况,但是从导轨指南中,他们suggest adding a header

  

默认情况下,Rails包含jQuery和一个不显眼的脚本适配器   对于jQuery,它在每个非GET上添加一个名为X-CSRF-Token的头   jQuery使用安全令牌进行的Ajax调用。没有这个标题,   非GET Ajax请求不会被Rails接受。当使用另一个   库要进行Ajax调用,有必要添加安全令牌   作为库中Ajax调用的默认标头。要获得令牌,   看看标签   由<%= csrf_meta_tags%>打印在您的应用程序视图中。

答案 1 :(得分:0)

这实际上被认为是Rails的一项功能,可以保护您免受CSRF攻击。设计可能会实现某种形式的伪造保护,因此您无法在没有适当令牌的情况下发出非GET请求(此令牌会添加到从Rails本身但不是Curl的请求中)。您可以查看" protect_from_forgery"的rails文档。我会包含一个链接,但我不确定您使用的是哪个版本的Rails。