ruby on rails 3 - tutorial - ¿Por qué no permite Devise que los usuarios no confirmados inicien sesión incluso cuando se establece allow_unconfirmed_access_for?
ruby on rails devise tutorial (3)
Tenemos una base de usuarios existente y estamos agregando confirmación por correo electrónico. La confirmación es opcional, pero permitirá funciones adicionales. Los usuarios no están obligados a confirmar. Agregué el módulo confirmable y realicé migraciones. La confirmación funciona como se anuncia.
Sin embargo, los usuarios no pueden iniciar sesión ya que no están confirmados. Todos los usuarios actuales tienen valores de confirmación nulos, que es lo que queremos (los usuarios pueden regresar y confirmar su correo electrónico en cualquier momento). Seguí todos los artículos wiki de Devise y establecí allow_unconfirmed_access_for en el inicializador:
config.allow_unconfirmed_access_for = 10.years
También intenté configurarlo en nuestro modelo de usuario:
devise :confirmable, allow_unconfirmed_access_for: 10.years
También intenté usar otros valores (1.oy 500. días, etc.)
Mi SessionsController, que no difiere mucho del método de Devise ( aquí en github )
class Users::SessionsController < Devise::SessionsController
respond_to :json
def new
redirect_to "/#login"
end
def create
resource = warden.authenticate(auth_options)
if !resource
render json: {error: "Invalid email or password" }, status: 401 and return
end
sign_in(resource_name, resource)
render "sign_in", formats: [:json], locals: { object: resource }
end
end
La respuesta de Devise:
{"error": "Debe confirmar su cuenta antes de continuar".}
Diseñar 2.1.2 con Rails 3.2.9.
El equipo de Devise ha lanzado una versión (2.2.4) que admite nil como un valor válido para allow_unconfirmed_access_for , lo que significa que no hay límite. Problema: https://github.com/plataformatec/devise/issues/2275
Ahora puede hacer:
config.allow_unconfirmed_access_for = nil
Simplemente necesitaba hacer esto en mi modelo de Usuario, en lugar de usar allow_unconfirmed_access_for:
protected
def confirmation_required?
false
end
Tengo el mismo problema: después de activar las confirmaciones de diseño, las cuentas creadas previamente no pueden iniciar sesión.
El motivo está aquí:
def confirmation_period_valid?
self.class.allow_unconfirmed_access_for.nil? || (confirmation_sent_at && confirmation_sent_at.utc >= self.class.allow_unconfirmed_access_for.ago)
end
Las cuentas antiguas tienen confirmation_sent_at establecido en cero, es por eso que no pueden iniciar sesión.
Una solución es forzar confirmation_sent_at así:
update users set confirmation_sent_at=created_at where confirmation_sent_at is NULL;
Puede hacerlo manualmente o crear una migración.