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