Le jeton de confirmation de Devise n'est pas valide
Mon Utilisateur.rb:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,:confirmable,:token_authenticatable,
:recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:name]
mes routes:
devise_for :users, :controllers => { :sessions => "sessions", :confirmations => "confirmations", :passwords => "passwords", :registrations => "registrations" }
mon Controller de confirmation est un controller standard mais avec une redirection différente.
j'ai un lien sur mon email comme:
/users/confirmation?confirmation_token=167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be
dans l'utilisateur de base de données a
confirmation_token:167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be
mais quand je clique sur ce lien Je ne vois que la page avec:
Resend confirmation instructions
Confirmation token is invalid
Ce que je ne faisais rien d'autre je définir.
CONFIRMATIONCONTROLLER:
def resource_params
params.require(:user).permit(:confirmation_token)
end
private :resource_params
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource_name, resource)
session['new_user'] = true
respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
else
respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
end
end
protected
# The path used after resending confirmation instructions.
def after_resending_confirmation_instructions_path_for(resource_name)
new_registration_path(resource_name)
end
je dis" contrôleur standard " parce que lorsque je le supprime et que je n'utilise pas de contrôleur personnalisé, le problème est le même.
3 réponses
quelle version de devise utilisez-vous? Si vous êtes sur 3.1.0
ou plus, ce comportement est attendu:
les jetons stockés dans la base de données ne sont pas censés correspondre aux jetons que vous envoyez dans les e-mails de confirmation. Voir devise/Livre/devise/modèles / confirmable.rb , qui contient maintenant ce qui suit:
def confirm_by_token(confirmation_token)
original_token = confirmation_token
confirmation_token = Devise.token_generator.digest(self, :confirmation_token, confirmation_token)
confirmable = find_or_initialize_with_error_by(:confirmation_token, confirmation_token)
Comme vous pouvez le voir, le token que vous passez dans les params de chaîne de requête est consommé par le Devise.token_generator
, et le résultat de cette opération est ce qui est comparé avec le token dans la base de données pour découvrir l'enregistrement de l'utilisateur.
il semble qu'il soit temporairement possible (en 3.1 mais pas en 3.2) de désactiver cette option en activant
config.allow_insecure_token_lookup = true
dans votre initialiseur de devise. Mais le comportement par défaut a été modifié pour rendre devise plus sûre. Voir ce billet de blog pour une description complète des améliorations de la sécurité dans le dispositif 3.1, y compris ce changement.
vous pouvez utiliser la solution ci-dessous (réglage config.allow_insecure_token_lookup = true
) mais, selon le changelog de Devise , cela ne sera disponible que temporairement.
le problème s'est probablement posé parce que vous avez lancé le générateur de conception pour rejeter toutes leurs vues dans la vôtre en arrière avant qu'ils n'aient fait ces changements. Puis tu as mis à jour ta gemme et tout le reste a changé, mais pas ton point de vue. Maintenant toutes vos vues et mailers liés à devise sont périmés et ça ne marchera pas avec les nouveaux styles de token.
vous pouvez voir les nouveaux e-mails à: https://github.com/plataformatec/devise/tree/master/app/views/devise/mailer . Le changement majeur est de changer cette ligne:
<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>
à
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
la différence principale est @resource.confirmation_token
devient juste @token
.
je change @resource.confirmation_token
en @token
alors ça marche.