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 bleibenIch habe eingerichtet:
Der neueste Devise-Code von GitHub (3.1.0, Ref. 041fcf90807df5efded5fdcd53ced80544e7430f)AUser
Klasse, die implementiertconfirmable
Verwenden 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ültigUnd 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