Wymyśl „Token potwierdzenia jest nieprawidłowy”, gdy użytkownik zarejestruje się
Korzystanie z Rails 4 i Devise 3.1.0 w mojej aplikacji internetowej. Napisałem test ogórka, aby przetestować rejestrację użytkownika; nie powiedzie się, gdy link „Potwierdź moje konto” zostanie kliknięty w wiadomości 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 "[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$
Ten błąd jest powtarzalny, gdy rejestruję się również ręcznie przez serwer WWW, więc nie wydaje się, aby był to problem Ogórka.
Chciałbym:
Użytkownik, aby móc jednym kliknięciem potwierdzić swoje konto za pomocą tego linku e-mailNiech użytkownik pozostanie zalogowany po potwierdzeniu swojego kontaMam konfigurację:
Najnowszy kod Devise z GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)AUser
klasa, która implementujeconfirmable
Używanie kontrolera potwierdzenia „domyślnego” (nie zdefiniowałem własnego niestandardowego).Przeczytałem te posty:
Devise potwierdzenie_token jest nieprawidłowyDevise 3.1: Teraz z bezpieczniejszymi ustawieniami domyślnymiGitHub Issue - Devise confirmation_token nieważnyI próbowałem:
Oprawaconfig.allow_insecure_tokens_lookup = true
w moim inicjatorze Devise, który zgłasza błąd „nieznanej metody” podczas uruchamiania. Poza tym brzmi to tak, jakby miało to być tylko tymczasowe rozwiązanie, więc chciałbym uniknąć jego użycia.Oczyściłem mój DB i zacząłem od zera (więc nie ma starych tokenów)Aktualizacja:
Sprawdzanie tokena potwierdzenia przechowywanego wUser
po rejestracji. Żeton wiadomości e-mail odpowiada tokenowi DB. Zgodnie z powyższymi postami, nowe zachowanie Devise mówi, że nie powinno, a zamiast tego powinno generować drugi token na podstawie tokena e-maila.To jest podejrzane. BieganieUser.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]')
zwraca użytkownika, który ma ustawione błędy "@messages = {: confirmation_token => [" is invalid "]}", co wydaje się być źródłem problemu.
Niedopasowanie tokenów wydaje się być sednem problemu; uruchomienie następującego kodu w konsoli w celu ręcznej zmiany tokenu potwierdzającego użytkownika powoduje potwierdzenie powodzenia:
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
Dlaczego więc zapisuje niewłaściwy token potwierdzenia w bazie danych? Używam niestandardowego kontrolera rejestracji ... może jest w tym coś, co powoduje, że jest źle ustawione?
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