簡體   English   中英

如果用戶未經授權,如何使用Devise發送CORS頭(401響應)

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

此方法用作ApplicationControllerbefore_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

這也被設置為ApplicationControllerbefore_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.

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