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?

40
demandé sur Andreas Lyngstad 2013-09-06 19:47:51

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.

91
répondu David Elner 2017-05-23 11:54:37

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
8
répondu Pogoapp 2014-01-06 20:48:36

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;
7
répondu Sergey Alekseev 2013-09-08 17:28:33

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
7
répondu Neal 2013-09-23 01:45:42

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)

1
répondu SaraVanaN 2014-10-17 09:30:50

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.

1
répondu eikes 2016-08-23 10:38:43