Как отправлять заголовки CORS с помощью Devise, если пользователь не авторизован (Ответ 401)

. Я работаю над приложением, в котором сервер и клиент, использующий 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

. Этот метод используется как before_filterв ApplicationController.

Для некоторых ресурсов пользователь должен пройти аутентификацию и авторизацию. Запросы выполняются через 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

. Это также установлено как before_filterв ApplicationController. Таким образом, фильтр для установки заголовков CORS срабатывает, и все работает нормально.

Я бы предпочел использовать поведение Devise по умолчанию, но заголовки CORS должны быть установлены в ответе 401. Как это сделать? Нужно ли для этого настраивать надзирателя ?

Как можно установить заголовки CORS для ответа 401, сгенерированного Devise, вместо создания моего собственного ответа?

18
задан Nils Blum-Oeste 25 June 2012 в 08:13
поделиться