[英]How to send CORS headers with Devise if user not authorized (401 response)
我正在開發一個應用程序,其中服務器和api消費客戶端位於不同的域下,所以我想使用CORS 。 為此,我必須在服務器響應中設置相應的http標頭:
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響應。
目前我使用的解決方法是不使用Devise身份驗證方法,而是使用自定義身份驗證代碼段:
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的默認行為,但必須在401響應中設置CORS頭。 這該怎么做? 我必須為此配置監護人嗎?
如何為Devise生成的401響應設置CORS頭,而不是創建自己的響應?
我成功地使用了rack-cors gem https://github.com/cyu/rack-cors,並在我的博客上概述了我的經驗。
Punchline:指定中間件訂單,因此cors處理程序在warden之前:
config.middleware.insert_before Warden::Manager, Rack::Cors
我們通常不喜歡CORS標頭。 我們更喜歡使用HAProxy來重定向。
使用HAProxy,您可以設置所有來到website.com/api/的請求,以便在內部重定向到您的rails計算機。
frontend main *:80
acl api path_beg -i /api
acl app path_beg -i /app
backend app_backend
reqrep ^([^\ ]*)\ /app/(.*) \1\ /\2
balance roundrobin
server app_files smartphoneapp.localhost:8000
backend api_backend
reqrep ^([^\ ]*)\ /api/(.*) \1\ /\2
balance roundrobin
server app_api localhost:3000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.