Pracuję nad aplikacją, w której serwer i klient korzystający z api znajdują się w różnych domenach, więc chciałbym użyć CORS. Aby to zrobić, trzeba ustawić odpowiednie nagłówki HTTP w odpowiedzi serwera:Jak wysłać nagłówki CORS z Devise, jeśli użytkownik nie jest autoryzowany (odpowiedź 401)
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
Ta metoda jest stosowana jako before_filter
w ApplicationController
.
W przypadku niektórych zasobów użytkownik musi zostać uwierzytelniony i autoryzowany. Wnioski są składane za pośrednictwem XHR/Ajax. Jeśli więc użytkownik nie jest uwierzytelniony, Devise wyśle odpowiedź 401 do klienta, zamiast przekierować na stronę logowania. Ale filtr do ustawienia nagłówków CORS nie jest używany do tej odpowiedzi. Zatem odpowiedź 401 nie jest wysyłana do klienta. Chcę złapać i użyć odpowiedzi 401 w kliencie.
Obecnie używam obejścia nie używając metody uwierzytelniania opracowania, ale fragment zwyczaj auth:
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
ten jest ustawiony jako before_filter
w ApplicationController
też. W ten sposób uruchamiany jest filtr do ustawiania nagłówków CORS i wszystko działa poprawnie.
Wolałbym użyć domyślnego zachowania Devise, ale nagłówki CORS musiałyby zostać ustawione w odpowiedzi 401. Jak to zrobić? Czy muszę do tego skonfigurować warden?
W jaki sposób można ustawić nagłówki CORS dla odpowiedzi 401 wygenerowanej przez program Devise, zamiast tworzyć własną odpowiedź?
Wciąż nie mam na to rozwiązanie. Aby podać trochę więcej kontekstu, sprawdź mój post na blogu o tym, jak go używam: http://nils-blum-oeste.net/cors-api-with-oauth2-authentication-using-rails-and-angularjs –