簡體   English   中英

Devise令牌認證無法驗證CSRF令牌的真實性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM