44 votes

Devise "Le jeton de confirmation n'est pas valide" lorsque l'utilisateur se connecte

À l'aide de Rails 4 et Concevoir 3.1.0 sur mon application web. J'ai écrit un Concombre de test pour tester la connexion de l'utilisateur; il échoue lorsque le "confirmer mon compte" avoir cliqué sur le lien de l'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$

Cette erreur est reproductible lorsque je m'inscris manuellement via le serveur web, donc il ne semble pas être un Concombre question.

Je voudrais:

  • L'utilisateur d'être en mesure à un seul clic de confirmer leur compte via cette adresse e-mail du lien
  • Demandez à l'utilisateur de rester connecté après la confirmation de leur compte

J'ai de l'installation:

  • Le dernier code de Concevoir, à partir de GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)
  • Un User classe qui implémente confirmable
  • À l'aide de la valeur "par défaut" confirmation contrôleur (je n'ai pas défini ma propre personnalisé.)

J'ai lu ces messages:

Et ont essayé de l':

  • Paramètre config.allow_insecure_tokens_lookup = true dans ma Concevoir initialiseur, qui jette un "inconnu méthode" erreur lors du démarrage. De Plus il semble que cela est supposé être une solution temporaire, donc j'aimerais éviter de l'utiliser.
  • Purgé ma DB et a commencé à partir de zéro (donc pas de vieux jetons sont présents)

Mise à jour:

De vérifier la confirmation de jeton stockées sur l' User après l'inscription. Les e-mails jeton correspond à la DBs jeton. Selon les postes ci-dessus, la nouvelle de Concevoir le comportement dit de ne pas censés le faire, et qu'au contraire, il devrait générer un deuxième jeton basé sur l'e-mail de jeton. C'est suspect. L'exécution User.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]') renvoie un Utilisateur qui a des erreurs de jeu "@messages={:confirmation_token=>["valide"]}", ce qui semble être la source du problème.

Le décalage des jetons semble être le cœur de la question; exécutant le code suivant dans la console pour modifier manuellement l'Utilisateur confirmation_token causes de confirmation pour réussir:

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

Alors pourquoi est-il sauver les mauvaises confirmation jeton de la DB en premier lieu? Je suis en utilisant une mesure d'inscription contrôleur... peut-être il ya quelque chose en elle qui la fait être mal réglé?

les itinéraires.rb

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

les utilisateurs/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

97voto

David Elner Points 2155

Si 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/confirmation_instructions.html.erb et le remplacer par quelque chose comme:

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

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ébloquer ou réinitialiser le mot de passe jeton de problèmes.

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