40 votes

La mise à niveau de concevoir 3.1 => obtention de jeton de Réinitialisation de mot de passe est invalide

Solution

Grâce à cette gist forme Steven Harman, je l'ai eu à travailler. 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 en charge les spécifications, pour le faire fonctionner dans le navigateur regarder Dave réponse ci-dessous.

Question D'Origine

Dans mon rails 4 app, je me suis mis à imaginer 3.1, et a couru rails s, puis j'ai obtenu 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 pour le dispositif d'initialiseur.

Après cela, j'obtiens l'erreur suivante quand j'ai essayer de réinitialiser le mot de passe

Reset password token is invalid

Il semble que le jeton qui est envoyé dans l'e-mail n'est pas correcte. Tout le reste fonctionne. Je vous connectant et comme un couteau chaud creux de beurre.

Mise à jour

Maintenant, je suppose que ça doit être quelque chose avec le cryptage de l' reset_password_token Ici de la fonction 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 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"

Toutes les idées sur ce que je suis absent?

91voto

David Elner Points 2155

Vous avez dit à ma question similaire il ya un peu, et j'ai trouvé une réponse qui pourrait vous aider.

La mise à niveau de Concevoir 3.1.0 laissé quelques 'trucs' un point de vue que je n'avais pas touché depuis un moment. Selon ce blog, vous avez besoin de changer votre devise mailer à utiliser @token à la place de la vieille - @resource.confirmation_token.

En app/views/<user>/mailer/reset_password_instructions.html.erb et le remplacer par 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 résoudre tout basée sur les jetons de confirmation problèmes que vous rencontrez. Cela est susceptible de résoudre tous les déverrouiller ou de la confirmation de jeton de problèmes.

8voto

Pogoapp Points 96

Pour info, si vous essayez d'envoyer un jeton de réinitialisation de mot de passe via un autre moyen (c'est à dire les différents mailer), vous pouvez utiliser le code comme ceci (creusé de Concevoir source), 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

7voto

Sergey Alekseev Points 1700

Je suppose que vous avez mis à niveau à Concevoir v3.1 pas v3.01, parce que d' config.secret_key. Donc je pense que c'est en quelque sorte lié à de nouveaux concevoir fonction - clé secrète.
J'ai trouvé deux s'engage pour la clé secrète fonctionnalité qui peut être utile pour mieux comprendre: https://github.com/plataformatec/devise/commit/32648027e282eb4c0f4f42e9c9cc0c961765faa8 https://github.com/plataformatec/devise/commit/d56641f514f54da04f778b2a9b816561df7910c2

Probablement, vous trouverez quelque chose d'utile pour vous http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ ainsi.
Vous pouvez aussi 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 dispositif expéditeur reçoit un jeton sur chaque argument la méthode. Si vous avez personnalisé le Concevoir mailer, vous aurez à mise à jour il. Tous les expéditeurs, les points de vue doivent également être mis à jour pour utiliser @jeton, comme indiqué ici, au lieu d'obtenir le jeton directement à partir de la ressource;

7voto

Neal Points 1594

J'ai eu cette erreur sur les specs. J'ai essayé de définir manuellement reset_password_token sur l'Utilisateur, donc je pourrais juste passer le jeton à l' edit_user_password_path. Toutefois, la remise à zéro des jetons sont hachés, ainsi configurer manuellement ne fonctionne pas. Oups! Pour éviter cette erreur, j'ai mis en reset_token égal au réel jeton généré, qui est retourné en user.send_reset_password_instructions.

Travail spec:

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

1voto

SaraVanaN Points 21

Dans votre devise réinitialiser le mot de passe du modèle assurez-vous contenu suivant devrait corriger:

=link_to "Modifier mon mot de passe', edit_password_url(@ressource :reset_password_token => @token)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X