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.

8
demandé sur Wordica 2013-08-23 00:20:29

3 réponses

quelle version de devise utilisez-vous? Si vous êtes sur 3.1.0 ou plus, ce comportement est attendu:

CHANGELOG.md

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.

17
répondu gregates 2014-05-06 15:25:32

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 .

5
répondu Erik Trautman 2014-05-06 01:43:29

je change @resource.confirmation_token en @token alors ça marche.

3
répondu scottxu 2014-07-25 03:19:19