我尝试在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令牌的真实性"
答案 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。