Évitez de vous connecter après avoir cliqué sur le lien de confirmation à l'aide de devise?

j'utilise devise gem, après avoir cliqué sur le lien de confirmation, je veux m'inscrire directement. À l'heure actuelle, il demande à s'inscrire de nouveau.

Récemment, j'ai ajouté ce qui suit dans le dispositif initialiser le fichier:

config.allow_insecure_token_lookup = true
config.secret_key = 'a8d814803c0bcc735ce657adc77793459d00154cdd7532c13d3489600dc4e963f86e14beb593a32cbe9dbbe9197c9ce50a30102f363d90350052dc8d69930033'

des suggestions?

36
demandé sur mfaerevaag 2013-09-06 14:14:42

6 réponses

dans les versions précédentes, L'Utilisateur a été automatiquement connecté après confirmation. Cela signifie que n'importe qui qui pourrait accéder à l'e-mail de confirmation pourrait signer dans le compte de quelqu'un en cliquant simplement le lien.

la signature automatique de l'utilisateur dans pourrait également être nuisible dans le flux de reconfirmation e-mail. Imaginons qu'un utilisateur décide de changer son adresse e-mail et, ce faisant, il a fait une faute de frappe sur la nouvelle adresse e-mail. Un e-mail sera envoyé à une autre adresse qui, avec le jeton dans les mains, pourrait signer dans ce compte.

si l'utilisateur corrige l'e-mail immédiatement, aucun mal ne sera fait. Mais si non, quelqu'un d'autre pourrait signer dans ce compte et l'utilisateur ne peut pas savoir que c'est arrivé.

Pour cette raison, Devise 3.1 ne signe plus automatiquement l'utilisateur après confirmation. Vous pouvez temporairement ramener l'ancien comportement après la mise à jour en mettant ce qui suit dans votre config/initializers/concevoir.rb:

config.allow_insecure_sign_in_after_confirmation = true

cette option ne sera disponible que temporairement pour faciliter la migration.

55
répondu Rajarshi Das 2013-09-06 10:42:43

config.allow_insecure_sign_in_after_confirmation flag n'est plus supporté dans Devise.

alors que vous devriez être conscient des problèmes de sécurité possibles de la connexion automatique des utilisateurs dans quand ils confirment leur compte (http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/), pour certaines applications, l'avantage en termes d'expérience utilisateur peut valoir le compromis de sécurité.

après tout, le risque de sécurité est que a) l'utilisateur mal-typé leur e-mail, b) ils ne corriger immédiatement leur erreur, c) l'e-mail qu'ils ont tapé correspond à un e-mail valide et fonctionnel, d) la personne qui reçoit incorrectement l'e-mail l'ouvre et clique sur le lien.

S'il s'agit d'un profil de risque acceptable pour votre application, vous pouvez outrepasser le dispositif de contrôle de confirmation:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])
    yield resource if block_given?

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_flashing_format?
      sign_in(resource) # <= THIS LINE ADDED
      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
end

Et de la route dans votre routes.rb:

devise_for :users, controllers: { confirmations: 'confirmations' }
51
répondu Louis Simoneau 2014-10-05 04:12:49

avec des versions plus récentes de Devise, vous pouvez faire ce qui suit.

config / routes.rb:

devise_for :users, controllers: { confirmations: 'users/confirmations' }

app/controllers/utilisateurs/confirmations_controller.rb:

class Users::ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      sign_in(resource)
    end
  end
end
15
répondu Sjors Provoost 2014-09-16 09:44:34

en regardant la réponse de mb21, il devrait être

def show
  super do |resource|
    if resource.confirmation_sent_at > DateTime.now-2.hours && resource.errors.empty?
      sign_in(resource)
    end
  end
end

confirmation_sent_at est le moment le courriel a été envoyé à l'utilisateur, par opposition à confirmed_at, qui est le moment où l'utilisateur clique sur le lien, qui est toujours dans les 2 heures maintenant sur le serveur quand il arrive...

3
répondu RAM 2016-05-18 04:27:41

nous voulions que l'utilisateur s'inscrive automatiquement si elle clique sur le lien dans l'email 2 heures ou moins après la création de l'utilisateur. D'après la réponse de @Sjor, nous sommes allés avec:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      if resource.confirmed_at > DateTime.now-2.hours && resource.errors.empty?
        sign_in(resource)
      end
    end
  end
end
1
répondu mb21 2016-03-18 12:31:43

Voici comment vous pouvez le résoudre.

Ce code permet à l'utilisateur de connecter automatiquement après confirmation, seulement si c'est la première fois pour confirmer son compte.

class ConfirmationsController < Devise::ConfirmationsController
  before_action :maybe_auto_sign_in, only: :show

  protected

  def after_confirmation_path_for(resource_name, resource)
    sign_in(resource) if @auto_sign_in
    super
  end

  private

  # Automatically sign in the user that confirmed his/her email first time.
  def maybe_auto_sign_in
    @auto_sign_in =
      User.first_time_confirming?(params[:confirmation_token])
  end
end

class User < ActiveRecord::Base
  def self.first_time_confirming?(confirmation_token)
    confirmation_token &&
      User.where(confirmation_token: confirmation_token, unconfirmed_email: nil)
          .exists?
  end
end
1
répondu WaKeMaTTa 2018-09-27 10:29:06