ruby-on-rails - usar - ruby on rails devise tutorial
Evitar el inicio de sesión después del enlace de confirmación, haga clic en usar la gema de diseño. (5)
Estoy usando la gema de devise
, después de hacer clic en el enlace de confirmación, quiero iniciar sesión directamente. En este momento, está solicitando el inicio de sesión nuevamente.
Recientemente, he agregado lo siguiente en el archivo de inicialización del dispositivo:
config.allow_insecure_token_lookup = true
config.secret_key = ''a8d814803c0bcc735ce657adc77793459d00154cdd7532c13d3489600dc4e963f86e14beb593a32cbe9dbbe9197c9ce50a30102f363d90350052dc8d69930033''
¿Alguna sugerencia?
Con las versiones más recientes de Devise, puede hacer lo siguiente.
config / routes.rb :
devise_for :users, controllers: { confirmations: ''users/confirmations'' }
app / controllers / users / confirmations_controller.rb :
class Users::ConfirmationsController < Devise::ConfirmationsController
def show
super do |resource|
sign_in(resource)
end
end
end
El config.allow_insecure_sign_in_after_confirmation
ya no es compatible con Devise.
Si bien debe ser consciente de las posibles preocupaciones de seguridad de iniciar sesión automáticamente en los usuarios cuando confirman su cuenta ( http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ ), para algunas aplicaciones el beneficio en términos de experiencia del usuario puede valer la compensación de seguridad.
Después de todo, el riesgo de seguridad es que a) el usuario tergiversa su correo electrónico, b) no corrige su error de inmediato, c) el correo electrónico que escribieron corresponde a un correo electrónico válido y funcional, d) la persona que recibe incorrectamente el correo electrónico lo abre y hace clic en el enlace.
Si este es un perfil de riesgo aceptable para su aplicación, puede anular el dispositivo ConfirmationsController:
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
Y routes.rb
a él en tus routes.rb
:
devise_for :users, controllers: { confirmations: ''confirmations'' }
En las versiones anteriores de Devise, el usuario ingresaba automáticamente después de la confirmación. Esto significaba que cualquiera que pudiera acceder al correo electrónico de confirmación podría iniciar sesión en la cuenta de alguien simplemente haciendo clic en el enlace.
Firmar automáticamente al usuario también podría ser dañino en el flujo de trabajo de reconfirmación de correo electrónico. Imagine que un usuario decide cambiar su dirección de correo electrónico y, al hacerlo, crea un error tipográfico en la nueva dirección de correo electrónico. Se enviará un correo electrónico a otra dirección que, con el token en las manos, podría iniciar sesión en esa cuenta.
Si el usuario corrige el correo electrónico de inmediato, no se dañará. Pero si no, alguien más podría iniciar sesión en esa cuenta y el usuario no sabría que sucedió.
Por este motivo, Devise 3.1
ya no firma automáticamente al usuario después de la confirmación. Puede recuperar temporalmente el antiguo comportamiento después de la actualización configurando lo siguiente en su config / initializers / devise.rb:
config.allow_insecure_sign_in_after_confirmation = true
Esta opción estará disponible solo temporalmente para ayudar a la migración.
Mirando la respuesta de mb21, debería ser
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 es el momento en que se envió el correo electrónico al usuario, en lugar de confirm_at, que es el momento en que el usuario hace clic en el enlace, que siempre se produce dentro de las 2 horas posteriores al servidor cuando ocurre ...
Queríamos que el usuario iniciara sesión automáticamente si hace clic en el enlace en el correo electrónico 2 horas o menos después de la creación del usuario. Según la respuesta de @Sjor, fuimos con:
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