2012-03-02 8 views
7

Powiązane: Rails 3 SSL routing redirects from https to http (niestety nie działa).w jaki sposób powinienem zrobić, aby wszystkie ścieżki do Devise używały https?

duplikatów, ale odpowiedź nie działa dla mnie: setting up ssl on devise

Mam aplikację, która została działa dobrze przez jakiś czas, ale teraz muszę dodać SSL do ścieżek login/edit ACCT. Używam Devise do uwierzytelniania. Znalazłem wpis w internetowej wiki, dzięki któremu proces wydaje się dość prosty, ale niech mnie diabli, jeśli uda mi się go uruchomić. Prosta część było to:

#in config/environments/production.rb 
config.to_prepare { Devise::SessionsController.force_ssl } 
config.to_prepare { Devise::RegistrationsController.force_ssl } 

A jeszcze około 25 linii kodu w tym GIST: https://gist.github.com/1040964

I Got That pracować dość dobrze, ale gdy kiedykolwiek wylogować dostaję 301 z sesje DELETE akcja, która wysyła mnie do GET.

Started DELETE "https://stackoverflow.com/users/sign_out" for 98.246.164.160 at 2012-03-02 01:45:42 +0000 
[02 Mar 01:45 10886 INFO] Processing by Devise::SessionsController#destroy as HTML 
[02 Mar 01:45 10886 INFO] Parameters: {"authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxx="} 
[02 Mar 01:45 10886 DEBUG] Parameters: {"_method"=>"delete", "authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxxx=", "action"=>"destroy", "controller"=>"devise/sessions"} 
[02 Mar 01:45 10886 INFO] Redirected to https://ec2-xx-xx-106-255.us-west-2.compute.amazonaws.com/users/sign_out 
[02 Mar 01:45 10886 INFO] Completed 301 Moved Permanently in 3ms 

Started GET "https://stackoverflow.com/users/sign_out" for xx.xx.164.160 at 2012-03-02 01:45:42 +0000 
[02 Mar 01:45 10886 FATAL] 
ActionController::RoutingError (No route matches [GET] "https://stackoverflow.com/users/sign_out"): 

Myślę, że muszę zacząć od zera. Jaki jest najprostszy sposób, aby dowolna ścieżka do prezentacji używała protokołu https, ale pozostałe ścieżki w mojej aplikacji używają http? Próbowałem tego (ze stanowiska SO u góry):

#devise routes 
    scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do 
    devise_for :users, :controllers => { :registrations => :registrations } 
    devise_for :admins 
    end 

Ale nie idź. Potrzebuję lepszej sugestii.

Odpowiedz

10

Brak odpowiedzi jeszcze, więc oto co stwierdził:

  1. Po uzyskaniu dostępu do witryny za pośrednictwem https, nie do niego dostęp za pośrednictwem protokołu HTTP, aż znaki użytkowników out (firesheep ataku). W artykule z linkami powyżej znajduje się wiele rzeczy dotyczących Devise'a, które omawiają tylko https na stronie logowania/wylogowywania. Kiepski pomysł.

  2. Wszystko, czego naprawdę potrzebujesz to:

    #in config/environments/production.rb 
    config.to_prepare { Devise::SessionsController.force_ssl } 
    config.to_prepare { Devise::RegistrationsController.force_ssl } 
    
  3. miałem mnóstwo zagadnień związanych z '' after_sign_in_path opracować. Okazuje się, że after_sign_out_path_for spodziewa się zwrócić ścieżkę - nie jest to wydarzenie, pyta, gdzie należy skierować użytkownika. Więc wróciłem root_path :protocol => 'http://' i że się tym zajął.

2

Spróbuj dokonywania całą aplikację wykorzystanie HTTPS dodając:

#in config/environments/production.rb 
config.force_ssl = true 

miałem zupełnie ten sam problem. Czasem dobrze się wylogowuję, czasami mam 301 z akcji DELETE i przekierowuję do GET. Dla mnie to był problem.

3

Upewnij się, że używasz protokołu HTTPS we wszystkich łączach Devise (unika się przekierowania force_ssl).

W swojej routes.rb (stosowana tylko w środowisku produkcyjnym):

scope defaults: (Rails.env.production? ? { protocol: 'https' } : {}) do 
    devise_for :users 
end 

teraz w Twoich użytkowania aplikacji:

destroy_user_session_url # use _url instead of _path so the protocol is added! 

teraz Twój wylogowania/wylogowaniu link (i inne linki opracować) wskaże bezpośrednio na https. Przepisywanie force_ssl z HTTP DELETE na HTTPS GET jest unikane.Wszystko działa :)

Powiązane problemy