2013-08-22 15 views
8

mio User.rb:Devise confirmation_token è valido

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable,:confirmable,:token_authenticatable, 
    :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:name] 

miei itinerari:

devise_for :users, :controllers => { :sessions => "sessions", :confirmations => "confirmations", :passwords => "passwords", :registrations => "registrations" } 

mio ConfirmationsController è un controller standard, ma con diversa reindirizzamento.

ho link sul mio email come:

/users/confirmation?confirmation_token=167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be 

In utente del database ha

confirmation_token:167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be 

ma quando clicco su quel link vedo solo la pagina con:

Resend confirmation instructions 
Confirmation token is invalid 

Cosa non faccio - cos'altro devo impostare.

CONFIRMATIONCONTROLLER:

def resource_params 
params.require(:user).permit(:confirmation_token) 
    end 
    private :resource_params 


    def show 
self.resource = resource_class.confirm_by_token(params[:confirmation_token]) 

if resource.errors.empty? 
    set_flash_message(:notice, :confirmed) if is_navigational_format? 
    sign_in(resource_name, resource) 
    session['new_user'] = true 
    respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) } 
else 
    respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new } 
end 
    end 

    protected 
    # The path used after resending confirmation instructions. 
    def after_resending_confirmation_instructions_path_for(resource_name) 
     new_registration_path(resource_name) 
    end 

dico "controller standard", perché quando ho rimuoverlo e non uso problema di controllo personalizzato è lo stesso.

+0

Invia il codice del controller "standard" ignorato. – TheIrishGuy

+0

e? C'è qualche bug o cosa ... cambio token ad abcde nel database e in url - e nulla cambia – Wordica

+0

Questo potrebbe non risolvere l'intero problema, ma se vuoi semplicemente reindirizzare su un percorso diverso dopo la conferma non dovresti copiare/incolla l'intero metodo. È necessario sovrascrivere il metodo protetto 'after_confirmation_path_for' per restituire il percorso desiderato. –

risposta

17

Quale versione di dispositivo stai usando? Se siete su 3.1.0 o superiore, è previsto questo comportamento:

CHANGELOG.md

I token che vengono memorizzati nel database non sono tenuti a corrispondere i gettoni che si inviano nei messaggi e-mail di conferma. Vedi devise/lib/devise/models/confirmable.rb, che ora contiene il seguente:

def confirm_by_token(confirmation_token) 
    original_token  = confirmation_token 
    confirmation_token = Devise.token_generator.digest(self, :confirmation_token, confirmation_token) 

    confirmable = find_or_initialize_with_error_by(:confirmation_token, confirmation_token) 

Come si può vedere, il token che si passa in via di query params stringa è consumato dal Devise.token_generator, e il risultato di tale operazione è ciò che è confrontato con il token in il database per scoprire il record dell'utente.

Sembra che sia temporaneamente possibile (in 3.1, ma non 3.2) si disattiva impostando

config.allow_insecure_token_lookup = true 

nel vostro initializer disposizione testamentaria. Ma il comportamento predefinito è stato modificato per rendere più sicuro il dispositivo. Vedere this blog post per un riepilogo completo dei miglioramenti di sicurezza in 3.1, compresa questa modifica.

+0

Secondo il blog citato, questa correzione sarà disponibile solo temporaneamente (http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more- Secure-defaults /). Qual è la soluzione permanente? –

+0

Questa non è una correzione, è una soluzione alternativa per le persone che eseguono l'aggiornamento da versioni precedenti. Non si può desiderare una distribuzione con Devise 3.1 per invalidare i token di conferma esistenti che dovrebbero essere validi. Se la tua applicazione ha personalizzato la conferma in modo che non funzioni con Devise> = 3.1, la "correzione" è di farlo funzionare con i nuovi token crittografati. Dal momento che ciò comporta la mancata o la ripetizione di personalizzazioni, ciò non rientra nell'ambito di questa domanda. Posso solo spiegare cosa stanno facendo in 3.1 e perché. – gregates

5

È possibile utilizzare la soluzione riportata di seguito (impostazione config.allow_insecure_token_lookup = true) ma, in base a the Devise changelog, sarà disponibile solo temporaneamente.

Il problema è probabilmente dovuto al fatto che è stato eseguito il generatore di effetti per scaricare tutte le loro viste nella propria parte posteriore prima di apportare queste modifiche. Poi hai aggiornato la tua gemma Devise e tutte le cose sul back-end sono cambiate, ma le tue opinioni no. Ora tutte le visualizzazioni e i mailer relativi al dispositivo non sono aggiornati e non funzioneranno con i nuovi stili di token.

È possibile visualizzare le nuove e-mail a: https://github.com/plataformatec/devise/tree/master/app/views/devise/mailer.Il principale cambiamento sta cambiando questa linea:

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p> 

a

<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p> 

La differenza principale è @resource.confirmation_token diventa solo @token.

3

Io cambio @resource.confirmation_token a @token quindi funziona.