Разработайте «токен подтверждения недействительным», когда пользователь регистрируется

Использование Rails 4 и Devise 3.1.0 в моем веб-приложении. Я написал тест Cucumber для проверки регистрации пользователя; происходит сбой при нажатии на ссылку «подтвердить мою учетную запись» из электронного письма.

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$

Эта ошибка воспроизводится, когда я регистрируюсь вручную через веб-сервер, поэтому она не является проблемой с огурцом.

Я хотел бы:

Пользователь сможет одним кликом подтвердить свою учетную запись через ссылку этого электронного письма.Пользователь должен войти в систему после подтверждения своей учетной записи

У меня есть настройки:

Последний код Devise от GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)A User класс, который реализуетconfirmableИспользование контроллера подтверждения «по умолчанию» (я не определил свой собственный.)

Я прочитал эти посты:

Разработать подтверждение_окен является недействительнымРазработать 3.1: теперь с более безопасными настройками по умолчаниюПроблема с GitHub - разработка несоответствующего токена подтверждения

И попробовал:

настройкаconfig.allow_insecure_tokens_lookup = true в моем инициализаторе Devise, который выдает ошибку «неизвестный метод» при запуске. Кроме того, звучит так, будто это только временное исправление, поэтому я бы хотел не использовать его.Очистил мою БД и запустил с нуля (так что никаких старых токенов нет)

Обновить:

Проверка токена подтверждения, хранящегося наUser после регистрации. Токен электронной почты соответствует токену БД. Согласно сообщениям выше, новое поведение Devise говорит, что не должно, и что вместо этого оно должно генерировать второй токен на основе токена электронной почты.Это подозрительно. БегUser.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]') возвращает пользователя с ошибками, установленного "@messages = {: подтвержение_token => [" недопустимо "]}", который, как представляется, является источником проблемы.

Несоответствие токенов, кажется, является основной проблемой; выполнение следующего кода в консоли для ручного изменения пользовательского параметра response_token приводит к успешному подтверждению:

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

Так почему же он сначала сохраняет неправильный токен подтверждения в БД? Я использую пользовательский контроллер регистрации ... может быть, в нем есть что-то, что приводит к неправильной настройке?

routes.rb

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

пользователи / 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

Ответы на вопрос(3)

Ваш ответ на вопрос