2012-03-02 15 views
7

Correlato: Rails 3 SSL routing redirects from https to http (sfortunatamente non ha funzionato).come devo fare per fare in modo che tutti i percorsi di Devise utilizzino https?

duplicati, ma la risposta non ha funzionato per me: setting up ssl on devise

Ho una web app che ha lavorato bene per un po 'di tempo, ma ho bisogno di aggiungere SSL per i percorsi di accesso/modifica acct. Sto usando Devise per l'autenticazione. Ho trovato una voce nel wiki di devise che ha reso il processo abbastanza semplice, ma dannazione se riesco a farlo funzionare. La parte semplice è questa:

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

E poi c'è circa 25 righe di codice in questo succo: https://gist.github.com/1040964

ho avuto che lavorare abbastanza bene, ma quando mai i dati di login ho un 301 dal le sessioni CANCELLANO l'azione che mi invia a un 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"): 

Quindi penso che ho bisogno di ricominciare da capo. Qual è il modo più semplice per rendere https qualsiasi percorso Devise, ma il resto dei percorsi nella mia app utilizza http? Ho provato questo (dal post SO in alto):

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

Ma non andare. Ho bisogno di un suggerimento migliore.

risposta

10

Nessuna risposta ancora, quindi ecco cosa ho concluso:

  1. Una volta che si accede a un sito tramite HTTPS, non accedervi tramite http finché l'utente esegue la disconnessione (attacco Firesheep). C'è un sacco di cose su Devise nell'articolo linkato sopra che discute solo di https sulla pagina di accesso/uscita. Cattiva idea.

  2. Tutto ciò che serve è questo:

    #in config/environments/production.rb 
    config.to_prepare { Devise::SessionsController.force_ssl } 
    config.to_prepare { Devise::RegistrationsController.force_ssl } 
    
  3. ho avuto un sacco di problemi che circondano 'after_sign_in_path' dal Devise. Si scopre che after_sign_out_path_for è in attesa di un percorso da restituire: non è un evento, ma chiede dove deve essere diretto l'utente. Così ho restituito root_path :protocol => 'http://' e che si è preso cura di esso.

2

Prova a fare il vostro uso app tutta HTTPS con l'aggiunta di:

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

ho avuto abbastanza lo stesso problema. A volte esco bene a volte ottengo 301 dall'azione DELETE e reindirizza a GET. Per me questo era il problema.

3

Assicurati di utilizzare https in tutti i tuoi collegamenti di Devise (questo evita il reindirizzamento force_ssl).

Nella tua routes.rb (applicata solo in ambiente di produzione):

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

Ora nel tuo uso dell'applicazione:

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

Ora il vostro disconnessione/esci di collegamento (e di altri collegamenti testamentaria) punterà direttamente su https. La riscrittura force_ssl da HTTP DELETE a HTTPS GET viene evitata.Funziona tutto :)

Problemi correlati