Domanda Definire "Token di conferma non valido" quando l'utente si iscrive


Utilizzo di Rails 4 e Devise 3.1.0 sulla mia app Web. Ho scritto un test di Cucumber per testare l'iscrizione degli utenti; non riesce quando viene cliccato il link "conferma il mio account" dall'e-mail.

Scenario: User signs up with valid data                                                           # features/users/sign_up.feature:9
    When I sign up with valid user data                                                             # features/step_definitions/user_steps.rb:87
    Then I should receive an email                                                                  # features/step_definitions/email_steps.rb:51
    When I open the email                                                                           # features/step_definitions/email_steps.rb:76
    Then I should see the email delivered from "no-reply@mysite.com"                                # features/step_definitions/email_steps.rb:116
    And I should see "You can confirm your account email through the link below:" in the email body # features/step_definitions/email_steps.rb:108
    When I follow "Confirm my account" in the email                                                 # features/step_definitions/email_steps.rb:178
    Then I should be signed in                                                                      # features/step_definitions/user_steps.rb:142
      expected to find text "Logout" in "...Confirmation token is invalid..." (RSpec::Expectations::ExpectationNotMetError)
     ./features/step_definitions/user_steps.rb:143:in `/^I should be signed in$

Questo errore è riproducibile quando registro manualmente tramite il server Web, quindi non sembra essere un problema di Cucumber.

Mi piacerebbe:

  • L'utente deve essere in grado di confermare con un clic il proprio account tramite il link di questa e-mail
  • Fai in modo che l'utente effettui l'accesso dopo aver confermato il suo account

Ho impostato:

  • L'ultimo codice Devise, da GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)
  • UN User classe che implementa confirmable
  • Utilizzo del controller di conferma 'predefinito' (non ho definito il mio personalizzato).

Ho letto questi post:

E ho provato:

  • Ambientazione config.allow_insecure_tokens_lookup = true nel mio inizializzatore Devise, che genera un errore 'metodo sconosciuto' all'avvio. Inoltre sembra che questo dovrebbe solo essere una soluzione temporanea, quindi mi piacerebbe evitare di usarlo.
  • Eliminato il mio DB e avviato da zero (quindi non sono presenti vecchi token)

Aggiornare:

Controllo del token di conferma memorizzato sul User dopo la registrazione. Il token e-mail corrisponde al token DB. Secondo i post precedenti, il nuovo comportamento di Devise dice che non è previsto, e che invece dovrebbe generare un secondo token basato sul token dell'e-mail. Questo è sospetto. In esecuzione User.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]') restituisce un utente con errori impostati "@messages = {: confirmation_token => [" non valido "]}", che sembra essere la fonte del problema.

I token di non corrispondenza sembrano essere il cuore del problema; l'esecuzione del seguente codice nella console per modificare manualmente il token di conferma dell'utente provoca la conferma dell'avvenuta riuscita:

new_token = Devise.token_generator.digest(User, :confirmation_token, '[EMAIL_TOKEN]')
u = User.first
u.confirmation_token = new_token
u.save
User.confirm_by_token('[EMAIL_TOKEN]') # Succeeds

Quindi, perché salva il token di conferma errato sul DB in primo luogo? Sto usando un controller di registrazione personalizzato ... forse c'è qualcosa in esso che lo fa essere impostato in modo errato?

routes.rb

  devise_for  :users,
          :path => '',
          :path_names => {
            :sign_in => 'login',
            :sign_out => 'logout',
            :sign_up => 'register'
            },
          :controllers => {
            :registrations => "users/registrations",
            :sessions => "users/sessions"
          }

utenti / registrations_controller.rb:

class Users::RegistrationsController < Devise::RegistrationsController

  def create
    # Custom code to fix DateTime issue
    Utils::convert_params_date_select params[:user][:profile_attributes], :birthday, nil, true

    super
  end

  def sign_up_params
    # TODO: Still need to fix this. Strong parameters with nested attributes not working.
    #       Permitting all is a security hazard.
    params.require(:user).permit!
    #params.require(:user).permit(:email, :password, :password_confirmation, :profile_attributes)
  end
  private :sign_up_params
end

44
2017-09-05 01:55


origine


risposte:


Quindi l'aggiornamento a Devise 3.1.0 ha lasciato un po '"cruft" in una vista che non avevo toccato da un po'.

Secondo questo post del blog, devi cambiare il tuo mailer Devise da usare @token invece del vecchio @resource.confirmation_token.

Trova questo in app/views/<user>/mailer/confirmation_instructions.html.erb e cambiarlo in qualcosa di simile:

<p>Welcome <%= @resource.email %>!</p>
<p>You can confirm your account email through the link below:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>

Questo dovrebbe risolvere eventuali problemi di conferma basati su token che stai riscontrando. È probabile che questo risolva eventuali problemi di sblocco o di reimpostazione dei token password.


96
2017-09-07 15:57



Una mia amica ha appena trovato questa domanda e mi ha mandato un'email chiedendomi se avessi capito questo, il che mi ha ricordato che non ho mai inviato la mia risposta, quindi ecco qui :)

Ho finito per reimpostare il token e l'utilizzo send per ottenere il token raw. È brutto, ma funziona per un pugno devise (3.5.1).

26   it "should auto create org" do
27     email = FG.generate :email
28     visit new_user_registration_path
29     fill_in :user_name, with: 'Ryan Angilly'
30     fill_in :user_user_provided_email, with: email
31     fill_in :user_password, with: '1234567890'
32 
33     expect do
34       click_button 'Continue'
35     end.to change { Organization.count }.by(1)
36 
37     expect(page.current_path).to eq(confirmation_required_path)
38     u = User.where(email: email).first
39     u.send :generate_confirmation_token
40     email_token = u.instance_variable_get(:@raw_confirmation_token)
41     u.save!
42     os = u.organizations
43     expect(os.size).to eq(1)
44     visit user_confirmation_path(confirmation_token: email_token)
45     o = os.first
46 
47     u.reload
48     expect(u.confirmed?)
49     expect(page.current_url).to eq(organization_getting_started_url(o))
50   end

0
2017-12-20 19:49



A partire dalla versione 3.5.2, il token di conferma non viene più digerito durante il processo di conferma. Ciò significa che il token nell'e-mail corrisponderà al token nel database.

Avevo ancora problemi con le conferme dopo averlo capito, ma nel mio caso si è rivelato un bug che ho introdotto quando ho annullato find_first_by_auth_conditions. Fissando il bug che ho introdotto in quel metodo, ho corretto i miei errori con la conferma.


0
2018-03-01 18:21