Gerät „Bestätigungstoken ist ungültig“, wenn sich der Benutzer anmeldet

Verwenden von Rails 4 und Devise 3.1.0 in meiner Web-App. Ich habe einen Gurkentest geschrieben, um die Benutzeranmeldung zu testen. Es schlägt fehl, wenn in der E-Mail auf den Link "Konto bestätigen" geklickt wird.

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 "[email protected]"                                # 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$

Dieser Fehler ist reproduzierbar, wenn ich mich auch manuell über den Webserver anmelde. Es handelt sich also anscheinend nicht um ein Gurkenproblem.

Ich würde gern:

Der Benutzer kann sein Konto mit einem Klick über den Link dieser E-Mail bestätigenLassen Sie den Benutzer nach Bestätigung seines Kontos angemeldet bleiben

Ich habe eingerichtet:

Der neueste Devise-Code von GitHub (3.1.0, Ref. 041fcf90807df5efded5fdcd53ced80544e7430f)A User Klasse, die implementiertconfirmableVerwenden des 'Standard'-Bestätigungscontrollers (Ich habe keinen eigenen benutzerdefinierten Controller definiert.)

Ich habe diese Beiträge gelesen:

Geräte-Bestätigungstoken ist ungültigDesign 3.1: Jetzt mit sichereren StandardeinstellungenGitHub-Problem - Gerät confirm_token ungültig

Und habe versucht:

Rahmenconfig.allow_insecure_tokens_lookup = true in meinem Devise-Initialisierer, der beim Start einen Fehler "unbekannte Methode" auslöst. Außerdem klingt es so, als ob dies nur eine vorübergehende Korrektur sein soll, und ich würde es gerne vermeiden, sie zu verwenden.Meine Datenbank bereinigt und von vorne begonnen (es sind also keine alten Token vorhanden)

Aktualisieren:

Überprüfen des auf dem gespeicherten Bestätigungs-TokensUser nach der Registrierung. Das E-Mail-Token stimmt mit dem DBs-Token überein. In den obigen Beiträgen heißt es, dass das neue Verhalten von Devise nicht das Gegenteil bedeuten soll und stattdessen ein zweites Token basierend auf dem Token der E-Mail generiert werden soll.Das ist verdächtig. LaufenUser.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]') Gibt einen Benutzer mit Fehlern zurück, für den "@messages = {: confirmation_token => [" ist ungültig "]}" festgelegt wurde. Dies scheint die Ursache des Problems zu sein.

Mismatching-Token scheinen das Herzstück des Problems zu sein. Wenn Sie den folgenden Code in der Konsole ausführen, um das confirm_token des Benutzers manuell zu ändern, wird die Bestätigung erfolgreich ausgeführt:

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

Warum speichert es also überhaupt das falsche Bestätigungstoken in der DB? Ich verwende einen benutzerdefinierten Registrierungs-Controller. Vielleicht ist etwas darin, das zu einer falschen Einstellung führt.

routes.rb

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

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage