2013-03-13 78 views
2

我已經使用令牌認證/ json API實現了Devise。 我現在的問題是,無論何時「?auth_token」錯誤或缺失,設計重定向我「HTTP/1.1 302臨時移動」到我預期的json錯誤響應,而不是直接返回:「HTTP/1.1 403 Forbidden」。Rails設計/令牌認證:如果令牌錯誤或丟失,重定向

我的錯誤響應來自我的SessionsController < Devise :: SessionsControllers「新」行動,我認爲它可能是錯誤的地方。

我找不到設計進行重定向或我可以改變這種行爲的地方。任何人都可以給我一個線索?

非常感謝你, 克里斯

回答

4

您可以創建一個定製故障紅寶石文件並把它在你的lib目錄中提供的重定向,只要你想,然後像它提到包括在您的色器件initializer在這SO Post

https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb

OR

您可以使用下面的代碼在自己的控制器:

故障應用程序的定義是定義

before_filter :correct_auth, :if => { request.format == :json } 

    def correct_auth 
    unless current_user 
     render :json => {'error' => 'authentication error'}, :status => 403 
    end 
    end 

因此,如果您auth_token是不正確這意味着沒有用戶應該登錄到應用程序,因此您可以顯示authentication error 403

+0

感謝您的回覆。 我剛試過你的第二種方法,但我仍然得到重定向作爲響應。如果我遵循重定向,我會導致正確的消息。不過,我想擺脫這種重定向。 我會嘗試你的第一種方法。我記得我已經試圖創造一個定製故障,並且也遇到了一些麻煩。 – 2013-03-13 11:13:15

+0

第一種方法奏效!謝謝。 我現在發現,我的http客戶端,我發送了我的請求,顯示「((從服務器返回的零長度響應。))」,而不是401未經授權...所以我認爲是錯誤的我的實施 – 2013-03-13 11:51:37

2

只是爲了文檔的目的,這裏的步驟我進行:

HOWTO devise custom failure app

添加到devise.rb

config.warden do |manager| 
    manager.failure_app = CustomFailure 
    end 

創建的lib /設計/ custom_failure.rb

class CustomFailure < Devise::FailureApp 

    def redirect_url 
    login_page_url 
    end 

    # You need to override respond to eliminate recall 
    def respond 
    if http_auth? 
     http_auth 
    else 
     if request.format.json? 
     self.status = :unauthorized 
     self.response_body = { :elements => {:id => "Authentication Failed", :description => "Invalid or missing authentication token"} }.to_json 
     self.content_type = "json" 
     else 
     redirect 
     end 
    end 
    end 

end 
+0

真的很有幫助!感謝您的解決方案 – 2016-02-18 11:55:41