Использование Rails 4 и Devise 3.1.0 в моем веб-приложении. Я написал тест огурца, чтобы протестировать пользователя; он не работает, когда на адрес электронной почты вызывается ссылка "подтвердить мою учетную запись".
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$
Эта ошибка воспроизводится, когда я регистрируюсь вручную через веб-сервер, поэтому она не кажется проблемой огурца.
Я бы хотел:
- Пользователь имеет возможность одним щелчком подтвердить свою учетную запись через эту ссылку по электронной почте.
- Если пользователь подтвердил свою учетную запись, войдите в аккаунт.
У меня есть настройка:
- Последний код разработчика, от GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)
- Класс
User
, реализующийconfirmable
- Использование контроллера подтверждения по умолчанию (я не определил свой собственный пользовательский.)
Я прочитал эти сообщения:
- Не удалось установить подтверждение_тока
- Разработать 3.1: теперь с более безопасными значениями по умолчанию
- Ошибка GitHub - отклонить подтверждение_token недействительно
И попробовали:
- Настройка
config.allow_insecure_tokens_lookup = true
в моем инициализаторе Devise, который вызывает ошибку "неизвестного метода" при запуске. Плюс это звучит так, как будто это только временное исправление, поэтому я бы хотел избежать его использования. - Очистил мою БД и начал с нуля (поэтому нет старых токенов)
Update:
Проверка маркера подтверждения, сохраненного на User
после регистрации. Токен электронной почты соответствует токену БД. Согласно вышеприведенным сообщениям, новое поведение Devise не предполагает, и вместо этого оно должно генерировать второй токен на основе токена электронной почты. Это подозрительно. Запуск User.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]')
возвращает пользователя, у которого установлены ошибки "@messages = {: confirm_token = > [" недействительно "]}", который, по-видимому, является источником проблемы.
Несовпадение жетонов, по-видимому, является сердцем проблемы; запуск следующего кода в консоли для ручного изменения подтверждения User_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