![](/img/trans.png)
[英]Rails 5 devise_token_auth Can't verify CSRF token authenticity
[英]Devise token auth can't verify CSRF token authenticity
我嘗試在Rails中創建應用程序,該應用程序將是常規的Web應用程序,並且也是用react native編寫的移動應用程序的api。 我將“ devise”與“ devise token auth” gem一起利用。 我將寶石添加到Gemfile並捆綁了。 接下來,我運行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
幸運的是,Web應用程序的常規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令牌的真實性”
CSRF令牌的真實性檢查源自您的Rails應用程序控制器。
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
您可以通過多種方法來處理這種情況,但是從rails指南中,他們建議添加標題 :
默認情況下,Rails包括jQuery和用於jQuery的簡單腳本適配器,該適配器在由jQuery使用安全性令牌進行的每個非GET Ajax調用上添加一個名為X-CSRF-Token的標頭。 如果沒有此標頭,Rails將不會接受非GET Ajax請求。 當使用另一個庫進行Ajax調用時,有必要將安全令牌添加為庫中Ajax調用的默認標頭。 要獲取令牌,請在應用程序視圖中查看由<%= csrf_meta_tags%>打印的標簽。
實際上,這被認為是Rails的一項功能,可以保護您免受CSRF攻擊。 Devise可能實現了某種形式的偽造保護,因此,沒有適當的令牌就不能發出非GET請求(此令牌被添加到從Rails本身而不是Curl發出的請求中)。 您可以在rails文檔中查看“ protect_from_forgery”。 我會包含一個鏈接,但是我不確定您使用的是哪個版本的Rails。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.