rails gema función example español ejemplos cuál ruby-on-rails devise ruby-on-rails-4

ruby on rails - gema - Rails 4+Devise: Restablecimiento de contraseña siempre está dando un error "Token no válido" en el servidor de producción, pero funciona bien localmente.



devise rails español (4)

Además de la corrección de doctororange, si está sobreescribiendo resource.find_first_by_auth_conditions , debe justificar el caso en el que warden_conditions contiene un reset_password_token lugar de un correo electrónico o nombre de usuario.

EDITAR: Para elaborar:

Devise agrega funcionalidad a su modelo cuando dice ''idear: registrable,: rastreable, ...''.

En su modelo de Usuario (o Administrador, etc.), puede sobrescribir el método Devise denominado find_first_by_auth_conditions. Este método especial es utilizado por la lógica de Devise para localizar el registro que está intentando iniciar sesión. Idear pasa algo de información en un parámetro llamado warden_conditions. Esto contendrá un correo electrónico, un nombre de usuario o una resete_password_token, o cualquier otra cosa que agregue a su formulario de inicio de sesión (como un ID de cuenta).

Por ejemplo, puede tener algo que se parece a esto:

(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

Sin embargo, el código anterior romperá la funcionalidad de restablecimiento de contraseña, porque idear está usando un token para ubicar el registro. El usuario no ingresa un correo electrónico, ingresa el token a través de una cadena de consulta en la URL, que se pasa a este método para intentar encontrar el registro.

Por lo tanto, cuando sobrescribe este método especial, debe hacerlo más robusto para tener en cuenta el caso de restablecimiento de contraseña:

(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

Tengo una aplicación de Rails 4 configurada para usar Devise, y tengo un problema con los restablecimientos de contraseña. Tengo configurada la aplicación de correo y el correo electrónico de restablecimiento de contraseña envía bien. El enlace proporcionado tiene asignado el valor correcto reset_password_token, que he consultado con esa base de datos. Sin embargo, cuando envío el formulario con las contraseñas formateadas correctamente, da un error que indica que el token de restablecimiento no es válido.

Sin embargo, el mismo código funciona bien localmente a través de los rails s . El correo electrónico envía, y realmente puedo restablecer la contraseña. El código que uso es solo el código estándar de Devise, no he anulado ninguno de él.

Tal vez es algo con Apache? No estoy muy familiarizado con eso. ¿Alguien tiene alguna idea?


Si está tomando la URL de un registro, puede aparecer así:

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

En este caso, usar 3DJ5Z5g6QNVQb3ZXkiKjTx como el token no funcionará porque =3D es realmente un = carácter codificado.

En este caso, debe usar J5Z5g6QNVQb3ZXkiKjTx (con 3D eliminado)


También puede valer la pena señalar (además de la publicación posterior de @ doctororange) lo siguiente si está utilizando una vista de correo de confirmación personalizada.

El enlace en la vista también ha cambiado aquí. Este es el NUEVO código de enlace:

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

Este es el código de enlace OLD:

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


Verifique el código en la app/views/devise/mailer/reset_password_instructions.html.erb

El enlace debe generarse con:

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

Si su vista todavía usa este código, esa será la causa del problema:

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

Devise comenzó a almacenar hashes del token, por lo que el correo electrónico debe crear el vínculo utilizando el token real ( @token ) en lugar del valor hash almacenado en la base de datos.

Este cambio ocurrió en Devise en 143794d701