tutorial rails español ruby-on-rails devise ruby-on-rails-4 factory-bot rspec2

ruby on rails - rails - Actualizar para diseñar 3.1=> obtener restablecer el token de contraseña no es válido



ruby on rails pdf (6)

Solución

Gracias a esta gist Steven Harman, lo hice funcionar. devise_mail_helpers.rb

module Features module MailHelpers def last_email ActionMailer::Base.deliveries[0] end # Can be used like: # extract_token_from_email(:reset_password) def extract_token_from_email(token_name) mail_body = last_email.body.to_s mail_body[/#{token_name.to_s}_token=([^"]+)/, 1] end end end

devise_mail_helpers.rb el archivo devise_mail_helpers.rb a la misma carpeta que las especificaciones de las características y escribí esta especificación.

require ''devise_mail_helpers.rb'' include Features include MailHelpers describe "PasswordResets" do it "emails user when requesting password reset" do user = FactoryGirl.create(:user) visit root_url find("#login_link").click click_link "Forgot your password?" fill_in "Email", :with => user.email click_button "Send instructions" current_path.should eq(''/users/sign_in'') page.should have_content("You will receive an email with instructions about how to reset your password in a few minutes.") last_email.to.should include(user.email) token = extract_token_from_email(:reset_password) # Here I call the MailHelper form above visit edit_password_url(reset_password_token: token) fill_in "user_password", :with => "foobar" fill_in "user_password_confirmation", :with => "foobar1" find(''.signup_firm'').find(".submit").click page.should have_content("Password confirmation doesn''t match Password") end end

Esto se ocupa de las especificaciones, para que funcione en el navegador, mire la respuesta de Dave a continuación.

Pregunta original

En mi aplicación Rails 4, me actualicé a 3.1 y ejecuté rails s , luego obtuve esto:

`raise_no_secret_key'': Devise.secret_key was not set. Please add the following to your Devise initializer: (RuntimeError) config.secret_key = ''--secret--''

Agregué la clave secreta al inicializador del dispositivo.

Después de esto, recibo el siguiente error cuando trato de restablecer la contraseña

Reset password token is invalid

Parece que el token que se envía en el correo electrónico no es correcto. Todo lo demás está funcionando. Entro y salgo como un cuchillo tibio a través de la mantequilla.

Actualizar

Ahora supongo que tiene que ser algo con el cifrado de reset_password_token Aquí desde la especificación de la característica:

user = FactoryGirl.create(:user, :reset_password_token => "something", :reset_password_sent_at => 1.hour.ago) visit edit_password_url(user, :reset_password_token => user.reset_password_token) fill_in "user_password", :with => "foobar" click_button "Change my password" page.should have_content("Password confirmation doesn''t match Password")

el error ocurrió es:

Failure/Error: page.should have_content ("Password confirmation doesn''t match Password") expected to find text "Password confirmation doesn''t match Password" in "Reset password token is invalid"

¿Alguna idea sobre lo que me estoy perdiendo?


Comentó hace un momento sobre mi pregunta similar , y encontré una respuesta que podría ayudarlo también.

La actualización a Devise 3.1.0 dejó un poco de ''cruft'' en una vista que no había tocado en mucho tiempo. De acuerdo con esta publicación del blog , debe cambiar su correo de Devise para usar @token lugar del antiguo @resource.confirmation_token .

Encuentre esto en la app/views/<user>/mailer/reset_password_instructions.html.erb y cámbielo a algo como:

<p>Hello <%= @resource.email %>!</p> <p>Someone has requested a link to change your password, and you can do this through the link below.</p> <p><%= link_to ''Change my password'', edit_password_url(@resource, :reset_password_token => @token) %></p> <p>If you didn''t request this, please ignore this email.</p> <p>Your password won''t change until you access the link above and create a new one.</p>

Esto debería solucionar cualquier problema de confirmación basado en token que estés teniendo. Es probable que también solucione cualquier problema de token de desbloqueo o confirmación.


Como otros han notado: la razón es que la vista que genera el correo que incluye el enlace de restablecer contraseña necesita ser cambiada.

Vi este error porque todavía estaba usando la gema devise-i18n-views , que genera el enlace anterior. Eliminar esa gema y confiar en las vistas que ahora forman parte de la gema devise-i18n resolvió el problema para mí.


En su plantilla de restablecimiento de contraseña, asegúrese de que el contenido siguiente sea correcto:

= link_to ''Cambiar mi contraseña'', edit_password_url (@resource,: reset_password_token => @token)


Para su información, si está tratando de enviar un token de contraseña de reinicio a través de otro medio (es decir, diferente correo), puede usar un código como este (extraído de la fuente de Devise), en su clase de usuario:

def send_invitation raw, enc = Devise.token_generator.generate(self.class, :reset_password_token) self.reset_password_token = enc self.reset_password_sent_at = Time.now.utc self.save(:validate => false) Notifier.signup_notification(contactable: self, token: raw).deliver end


Supongo que has actualizado Devise a v3.1 no v3.01, debido a config.secret_key . Por lo tanto, creo que de alguna manera está relacionado con la nueva característica de diseño: clave secreta.
Encontré dos confirmaciones para la función clave secreta que pueden ser útiles para una mejor comprensión: https://github.com/plataformatec/devise/commit/32648027e282eb4c0f4f42e9c9cc0c961765faa8 https://github.com/plataformatec/devise/commit/d56641f514f54da04f778b2a9b816561df7910c2

Probablemente encontrará algo útil para usted en http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ también.
También puedes grep reset_password_token en https://github.com/plataformatec/devise/compare/v3.0...v3.1.0 .

EDITAR
Lea en http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ :

  • El programa de publicidad Devise ahora recibe un argumento token adicional en cada método. Si ha personalizado el anuncio de Devise, tendrá que actualizarlo. Todas las vistas de los remitentes también deben actualizarse para usar @token , como se muestra here , en lugar de obtener el token directamente del recurso;

Tuve este error en las especificaciones. Estaba intentando configurar manualmente reset_password_token en el usuario para poder pasar el token a edit_user_password_path . Sin embargo, los tokens de reinicio son hash, por lo que configurarlo manualmente no funcionará. Oops! Para evitar este error, configuro reset_token igual al token real generado que devuelve user.send_reset_password_instructions .

Especificación de trabajo:

require ''spec_helper'' feature ''User resets password'' do scenario ''fills out reset form'' do user = create(:user) reset_token = user.send_reset_password_instructions new_password = ''newpassword!'' visit edit_user_password_path(user, reset_password_token: reset_token) fill_in :user_password, with: new_password fill_in :user_password_confirmation, with: new_password click_button ''Change my password'' expect(page).to have_content( ''Your password was changed successfully. You are now signed in.'' ) end end