我正在研究一個應用程序,其中服務器和api消費客戶端位於不同的域下,所以我想使用CORS。要做到這一點,我已經在服務器響應以設置相應的HTTP標頭:如果用戶未經授權,如何發送CORS頭文件(401響應)
def cors_set_access_control_headers
headers['Access-Control-Allow-Origin'] = 'http://localhost'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*, X-Requested-With, X-Prototype-Version, X-CSRF-Token, Content-Type'
headers['Access-Control-Max-Age'] = "1728000"
end
該方法被用作一個ApplicationController
before_filter
。
對於一些資源,用戶必須經過認證和授權。請求通過XHR/Ajax完成。因此,如果用戶未通過認證,Devise將向客戶端發送401響應,而不是重定向到登錄頁面。但是用於設置CORS頭的過濾器不用於該響應。因此401響應不會發送給客戶端。我想在客戶端捕獲並使用401響應。
目前我使用一種變通方法不使用的設計驗證方法,但是自定義AUTH片段:
def authenticate_cors_user
if request.xhr? && !user_signed_in?
error = { :error => "You must be logged in." }
render params[:format].to_sym => error, :status => 401
end
end
這被設置爲ApplicationController
一個before_filter
了。通過這種方式,設置CORS頭部的過濾器被觸發並且一切正常。
我寧願使用Devise的默認行爲,但CORS頭將不得不在401響應中設置。這個怎麼做?我必須爲此配置warden嗎?
如何爲Devise生成的401響應設置CORS頭,而不是創建自己的響應?
可是我還是不有專門的解決方案。爲了提供更多的上下文,請查看我的博客文章,瞭解我如何使用此功能:http://nils-blum-oeste.net/cors-api-with-oauth2-authentication-using-rails-and-angularjs –