É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?
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.
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' }
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
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...
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
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