2016-08-24 61 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。

相關問題