2013-09-06 17 views
40

Soluzioneaggiornamento a ideare 3.1 => ottenere token reimpostazione password non è valida

Grazie a questo modulo gist Steven Harman, ho capito di lavoro. 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 

ho aggiunto il file devise_mail_helpers.rb nella stessa cartella e le caratteristiche specifiche e scritto questo spec.

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 

Questo si occupa delle specifiche, per farlo funzionare nel browser guarda la risposta di Dave qui sotto.

domanda iniziale

Nei miei rotaie 4 app, ho aggiornato disposizione testamentaria al 3,1 e corse rails s, quindi ho ottenuto questo:

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

ho aggiunto la chiave segreta per l'inizializzazione escogitare .

Dopo questo ho il seguente errore quando si tenta di reimpostare la password

Reset password token is invalid 

Sembra che il token che viene inviato nella e-mail non è corretto. Tutto il resto funziona. Accedo ed esco come un coltello caldo attraverso il burro.

Aggiornamento

Ora immagino che è avuto modo di essere qualcosa con la crittografia del reset_password_token Qui dalla funzione specifica:

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") 

è verificato l'errore è:

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" 

Qualche idea su cosa mi manca?

risposta

91

Hai commentato il my similar question un po 'di tempo fa e ho trovato una risposta che potrebbe aiutarti anche tu.

L'aggiornamento a Devise 3.1.0 ha lasciato un po '"cruft" in una vista che non avevo toccato da un po'. In base a this blog post, è necessario modificare il mailer di Devise per utilizzare @token anziché il vecchio @resource.confirmation_token.

trovare questo in app/views/<user>/mailer/reset_password_instructions.html.erb e cambiarlo a qualcosa di simile:

<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> 

Questo dovrebbe risolvere gli eventuali problemi di conferma basate su token che stai avendo. È probabile che questo risolva anche eventuali problemi relativi ai token di sblocco o di conferma.

+0

Questa è la soluzione corretta per far funzionare il browser, ma come testarlo? –

+0

A colpo d'occhio, il tuo test Rspec sopra sembra che dovrebbe fare il trucco. Supponendo che il problema del "token non valido" sia scomparso, e se si verifica un errore in un punto specifico, è necessario condividere l'errore. Strategicamente parlando, la combinazione di Rspec o Cucumber con email_spec dovrebbe consentire di testare automaticamente questo aspetto. La mia domanda collegata e [questo wiki] (https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Cucumber) hanno ulteriori informazioni su come testare Devise con Cucumber. –

+0

il test sta passando. Prima di risolvere il problema, non funzionava con "token non valido". –

7

Immagino che tu abbia aggiornato Devise alla v3.1 non v3.01, a causa di config.secret_key. Quindi penso che sia in qualche modo collegato alla nuova funzionalità di ideazione: la chiave segreta.
Ho trovato due commit per la funzione chiave segreta che possono essere utili ad una migliore comprensione: https://github.com/plataformatec/devise/commit/32648027e282eb4c0f4f42e9c9cc0c961765faa8 https://github.com/plataformatec/devise/commit/d56641f514f54da04f778b2a9b816561df7910c2

Probabilmente troverete qualcosa di utile per voi su http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ pure.
Inoltre è possibile grep reset_password_token su https://github.com/plataformatec/devise/compare/v3.0...v3.1.0.

EDIT
Leggi il http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/:

  • Il programma di posta Devise ora riceve un argomento in più gettone ogni metodo . Se hai personalizzato il mailer Devise, dovrai aggiornarlo con lo .Tutte le viste mailer anche bisogno di essere aggiornato per utilizzare @token, come mostrato here, invece di ottenere il token direttamente dal risorsa;
+0

Grazie! Ho studiato un po 'di più. Conosco le modifiche alla gestione dei token in Devise. Quindi, ho avuto modo di lavorare nel browser. Ma come testarlo? Ci sono alcuni suggerimenti nel commento sul [blog] (http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/). Per la via Ho corretto l'errore di battitura 3.01 in 3.1. –

7

Ho avuto questo errore sulle specifiche. Stavo cercando di impostare manualmente reset_password_token sull'utente in modo che potessi semplicemente passare il token allo edit_user_password_path. Tuttavia, i token di reset sono sottoposti a hash, quindi l'impostazione manuale non funzionerà. Oops! Per evitare questo errore, ho impostato reset_token uguale al token effettivo generato che viene restituito da user.send_reset_password_instructions.

spec lavoro:

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 
+0

Questo dovrebbe avere più voti positivi: D – trueinViso

8

Cordiali saluti, se si sta cercando di inviare un token di reimpostazione della password tramite un altro mezzo (cioè mailer diversa), è possibile utilizzare il codice come questo (scavata fonte Devise), nella classe User:

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 
+0

La chiave è 'self.reset_password_token = enc', e l'impostazione' @token = raw'. Grazie mille ~! – Mirror318

1

nella vostra disposizione testamentaria modello reimpostazione della password assicurarsi seguente contenuto dovrebbe correggere:

= link_to 'Cambia password', edit_password_url (@Resource,: reset _password_token => @token)

1

Come altri hanno notato: il motivo è che la vista che genera la posta che include il link della password di ripristino deve essere cambiata.

Ho visto questo errore perché stavo ancora usando la gemma devise-i18n-views, che genera il vecchio collegamento. Rimuovere questo gioiello e fare affidamento sulle viste che ora fanno parte della gemma devise-i18n ha risolto il problema per me.

Problemi correlati