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