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