2016-08-24 68 views
1

我尝试在rails中创建应用程序,这将是常规Web应用程序,也是针对以本机方式编写的移动应用程序的api。我利用“设计令牌认证”的优势与“设计”一起。 我将宝石添加到Gemfile并运行包。接下来我跑了 rails g devise_token_auth:install User auth。最后,我改变了路线:Devise token auth无法验证CSRF令牌的真实性

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 

的web应用程序幸运定期sign_in和sign_up工作,但是当我尝试发送请求,利用卷曲API:

curl -H "Content-Type: application/json" -X POST -d '{"email":"[email protected]","password":"aaaaaaaa"}' http://localhost:3000/api/v1/auth/sign_in 

我得到的消息“无法验证CSRF令牌真实性“

回答

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的,这在每个由jQuery和安全性令牌进行的非GET调用Ajax调用中添加一个名为X-CSRF-Token的头文件。如果没有这个头文件, Rails不会接受非GET Ajax请求。当使用另一个 库进行Ajax调用时,需要将安全令牌 添加为库中Ajax调用的默认标头。要获取令牌,请在应用程序视图中查看标记 打印的<%= csrf_meta_tags%>。

+0

非常感谢,清除了一些东西 –

0

这实际上被认为是Rails的一项功能,可以保护您免受CSRF攻击。设计可能实现了某种形式的伪造保护,所以你不能在没有合适的标记的情况下发出非GET请求(这个标记被添加到由Rails本身创建的请求中,而不是Curl)。您可以查看rails的文档“protect_from_forgery”。我会包含一个链接,但我不确定你正在使用哪个版本的Rails。

相关问题