ruby on rails tutorial Rails 4+Devise: la reimpostazione della password dà sempre un errore "Token non valido" sul server di produzione, ma funziona bene localmente.




include devise:: testhelpers (4)

Ho installato un'applicazione Rails 4 per utilizzare Devise e sto avendo problemi con la reimpostazione della password. Ho impostato il mailer e l'e-mail di reimpostazione della password va bene. Al link fornito è stato assegnato il corretto reset_password_token, che ho controllato con quel database. Tuttavia, quando invio il modulo con password formattate correttamente, viene visualizzato un errore che indica che il token di ripristino non è valido.

Tuttavia, lo stesso identico codice funziona bene localmente attraverso i rails s . L'email invia e posso effettivamente resettare la password. Il codice che uso è solo il codice standard Devise, non l'ho sovrascritto.

Forse è qualcosa con Apache? Non ho molta familiarità con questo. Qualcuno ha qualche idea?


Se stai prendendo l'URL da un registro, può apparire in questo modo:

web_1      | <p><a href=3D"http://localhost:3000/admin/password/edit?reset_password_to=
web_1      | ken=3DJ5Z5g6QNVQb3ZXkiKjTx">Change password</a></p>

In questo caso, usa 3DJ5Z5g6QNVQb3ZXkiKjTx poiché il token non funzionerà perché =3D è veramente un carattere = codificato.

In questo caso, devi usare J5Z5g6QNVQb3ZXkiKjTx (con 3D rimosso)


Potrebbe anche essere utile notare (oltre a @ doctororange's post ablve) quanto segue se si sta utilizzando una vista mailer di conferma personalizzata.

Anche il link nella vista è cambiato qui. Questo è il NUOVO codice di collegamento:

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

Questo è il codice di collegamento OLD:

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

Oltre alla correzione di doctororange, se si sovrascrivono resource.find_first_by_auth_conditions , è necessario tenere conto del caso in cui warden_conditions contiene un reset_password_token invece di un'e-mail o un nome utente.

EDIT: per elaborare:

Devise aggiunge funzionalità al tuo modello quando dici 'escogitare: registrabile,: rintracciabile, ...'.

Nel modello utente (o amministratore, ecc.), È possibile sovrascrivere il metodo Devise denominato find_first_by_auth_conditions. Questo metodo speciale viene utilizzato dalla logica Devise per individuare il record a cui si sta tentando di accedere. Devise passa in alcune informazioni in un parametro chiamato warden_conditions. Ciò conterrà un messaggio di posta elettronica, un nome utente o un reset_password_token o qualsiasi altra cosa aggiunta al tuo modulo di accesso (ad esempio un ID account).

Ad esempio, potresti avere qualcosa che assomiglia a questo:

(app/models/user.rb)
class User

  ...

  def self.find_first_by_auth_conditions warden_conditions
    conditions = warden_conditions.dup

    if (email = conditions.delete(:email)).present?
      where(email: email.downcase).first
    end
  end

end

Tuttavia, il suddetto codice interromperà la funzionalità di reimpostazione della password, poiché concepire utilizza un token per individuare il record. L'utente non immette un'email, inserisce il token tramite una stringa di query nell'URL, che viene passato a questo metodo per cercare di trovare il record.

Pertanto, quando si sovrascrive questo metodo speciale, è necessario renderlo più affidabile per tenere conto del caso di reimpostazione della password:

(app/models/user.rb)
class User

  ...

  def self.find_first_by_auth_conditions warden_conditions
    conditions = warden_conditions.dup

    if (email = conditions.delete(:email)).present?
      where(email: email.downcase).first
    elsif conditions.has_key?(:reset_password_token)
      where(reset_password_token: conditions[:reset_password_token]).first
    end
  end

end

Controlla il codice in app/views/devise/mailer/reset_password_instructions.html.erb

Il link dovrebbe essere generato con:

edit_password_url(@resource, :reset_password_token => @token)

Se la tua vista utilizza ancora questo codice, questa sarà la causa del problema:

edit_password_url(@resource, :reset_password_token => @resource.password_reset_token)

Devise ha iniziato a memorizzare gli hash del token, quindi l'e-mail deve creare il collegamento usando il token reale ( @token ) piuttosto che il valore hash memorizzato nel database.

Questo cambiamento si è verificato in 143794d701 nel 143794d701





ruby-on-rails-4