À l'aide de Rails 4 et Concevoir 3.1.0 sur mon application web. J'ai écrit un Concombre de test pour tester la connexion de l'utilisateur; il échoue lorsque le "confirmer mon compte" avoir cliqué sur le lien de l'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 "no-reply@mysite.com" # 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$
Cette erreur est reproductible lorsque je m'inscris manuellement via le serveur web, donc il ne semble pas être un Concombre question.
Je voudrais:
- L'utilisateur d'être en mesure à un seul clic de confirmer leur compte via cette adresse e-mail du lien
- Demandez à l'utilisateur de rester connecté après la confirmation de leur compte
J'ai de l'installation:
- Le dernier code de Concevoir, à partir de GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)
- Un
User
classe qui implémenteconfirmable
- À l'aide de la valeur "par défaut" confirmation contrôleur (je n'ai pas défini ma propre personnalisé.)
J'ai lu ces messages:
- Concevoir confirmation_token est pas valide
- Concevoir 3.1: Maintenant avec plus sécurisé par défaut
- GitHub Question - Concevoir confirmation_token invalide
Et ont essayé de l':
- Paramètre
config.allow_insecure_tokens_lookup = true
dans ma Concevoir initialiseur, qui jette un "inconnu méthode" erreur lors du démarrage. De Plus il semble que cela est supposé être une solution temporaire, donc j'aimerais éviter de l'utiliser. - Purgé ma DB et a commencé à partir de zéro (donc pas de vieux jetons sont présents)
Mise à jour:
De vérifier la confirmation de jeton stockées sur l' User
après l'inscription. Les e-mails jeton correspond à la DBs jeton. Selon les postes ci-dessus, la nouvelle de Concevoir le comportement dit de ne pas censés le faire, et qu'au contraire, il devrait générer un deuxième jeton basé sur l'e-mail de jeton. C'est suspect. L'exécution User.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]')
renvoie un Utilisateur qui a des erreurs de jeu "@messages={:confirmation_token=>["valide"]}", ce qui semble être la source du problème.
Le décalage des jetons semble être le cœur de la question; exécutant le code suivant dans la console pour modifier manuellement l'Utilisateur confirmation_token causes de confirmation pour réussir:
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
Alors pourquoi est-il sauver les mauvaises confirmation jeton de la DB en premier lieu? Je suis en utilisant une mesure d'inscription contrôleur... peut-être il ya quelque chose en elle qui la fait être mal réglé?
les itinéraires.rb
devise_for :users,
:path => '',
:path_names => {
:sign_in => 'login',
:sign_out => 'logout',
:sign_up => 'register'
},
:controllers => {
:registrations => "users/registrations",
:sessions => "users/sessions"
}
les utilisateurs/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