Mise à jour de la valeur 3.1 = > Réinitialiser le mot de passe est invalide
Solution
grâce à ce gist de Steven Harman, j'ai réussi. 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
j'ai ajouté le fichier devise_mail_helpers.rb
dans le même dossier que les caractéristiques caractéristiques et écrit de cette spécification.
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
cela prend soin des spécifications, pour faire fonctionner dans le navigateur, regardez la réponse de Dave ci-dessous.
Question Initiale
dans mon application rails 4, j'ai mis à jour la version 3.1 et j'ai lancé rails s
, puis j'ai eu ceci:
`raise_no_secret_key': Devise.secret_key was not set.
Please add the following to your Devise initializer: (RuntimeError)
config.secret_key = '--secret--'
j'ai ajouté la clé secrète à l'initialiseur de devise.
après cela, j'obtiens l'erreur suivante quand j'essaie de réinitialiser le mot de passe
Reset password token is invalid
il semble que le jeton qui est envoyé dans l'email n'est pas correct. Tout le reste fonctionne. Je connexion et à la déconnexion comme un couteau chaud creux de beurre.
mise à Jour
maintenant je suppose que ce doit être quelque chose avec le cryptage du reset_password_token
ici à partir de la fonctionnalité spec:
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")
l'erreur se produit est:
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"
une idée de ce que je rate?
6 réponses
vous avez commenté sur ma question similaire il y a peu, et j'ai trouvé une réponse qui pourrait vous aider aussi.
La mise à niveau de vers la version 3.1.0 a laissé un point de vue que je n'avais pas touché depuis un moment. Selon ce post de blog , vous devez changer votre Mailer de Devise à utiliser @token
au lieu de l'ancien @resource.confirmation_token
.
trouvez ceci dans app/views/<user>/mailer/reset_password_instructions.html.erb
et changez-le en quelque chose comme:
<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>
cela devrait corriger tous les problèmes de confirmation par token que vous rencontrez. Ceci est susceptible de corriger également tout problème de déverrouillage ou de token de confirmation.
POUR INFORMATION, Si vous essayez d'envoyer un jeton de mot de passe réinitialisé par un autre moyen (c.-à-d. un autre mailer), vous pouvez utiliser le code comme ceci (extrait de la source de Devise), dans votre classe D'utilisateur:
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
je suppose que vous avez mis en valeur Devise en v3.1 pas v3.01, à cause de config.secret_key
. Donc je pense que c'est en quelque sorte lié à la nouvelle fonctionnalité de conception - clé secrète.
J'ai trouvé deux commits pour la caractéristique clé secrète qui peut être utile à une meilleure compréhension:
https://github.com/plataformatec/devise/commit/32648027e282eb4c0f4f42e9c9cc0c961765faa8
https://github.com/plataformatec/devise/commit/d56641f514f54da04f778b2a9b816561df7910c2
vous trouverez probablement quelque chose d'utile sur http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults / as well.
Aussi, vous pouvez grep reset_password_token sur https://github.com/plataformatec/devise/compare/v3.0...v3.1.0 .
MODIFIER
Lire sur http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults / :
- le Mailer de Devise reçoit maintenant un argument supplémentaire de token sur chaque méthode. Si vous avez personnalisé le concepteur de courrier, vous devrez la mise à jour. toutes les vues mailers doivent également être mises à jour pour utiliser @token , comme indiqué ici , au lieu d'obtenir le token directement à partir de le des ressources;
j'avais cette erreur sur les spécifications. J'essayais de régler manuellement reset_password_token
sur L'utilisateur pour que je puisse passer le token au edit_user_password_path
. Cependant, les tokens de réinitialisation sont hachés, donc le réglage manuel ne fonctionnera pas. Oops! Pour éviter cette erreur, j'ai placé reset_token
égal au jeton généré qui est retourné par user.send_reset_password_instructions
.
spécifications de travail:
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
dans votre modèle de mot de passe de réinitialisation de devise, assurez-vous que le contenu suivant doit être corrigé:
=link_to "Modifier mon mot de passe', edit_password_url(@ressource :reset_password_token => @token)
comme d'autres l'ont noté: la raison est que la vue qui génère le courrier électronique qui inclut le lien Réinitialiser mot de passe doit être changée.
j'ai vu cette erreur parce que j'utilisais TOUJOURS le devise-i18n-views
gem, qui génère l'ancien lien. La suppression de cette pierre précieuse et le fait de se fier aux vues qui font maintenant partie de la pierre précieuse devise-i18n
ont résolu le problème pour moi.