Estoy portando un proyecto de Rails 3 a 3.1. Mi sistema de autenticación se cambió fácilmente a la nueva has_secure_password en ActiveRecord. El único problema al que me estoy enfrentando es que también utilizo OmniAuth y configuré el sistema de modo que si un usuario se registra utilizando uno de los proveedores de OmniAuth, la cuenta no debería requerir una contraseña. Parece que no puedo anular la configuración de validaciones de password_digest mediante has_secure_password. ¿Hay alguna forma de desactivar esas validaciones y escribir las mías, o voy a tener que usar las funciones escritas a mano de mi versión de Rails 3 del sitio?Getting Rails 3.1's has_secure_password para funcionar bien con OmniAuth
Respuesta
Terminé volviendo al uso de métodos personalizados. Sin embargo, después me di cuenta de que debería haber sido capaz de utilizar una devolución de llamada before_validation para verificar las condiciones, luego, si coinciden, establezca password_digest en algo simple como '0'. De esta forma, el resumen nunca estará en blanco, pero al mismo tiempo no debería validar como una contraseña correcta, lo que hace que inicie sesión a través de OmniAuth.
No dude en corregirme si me equivoco.
Scott, su idea es correcta. He estado luchando con este problema en vano. Traté de anular 'has_secure_password' y simplemente no funcionará. No importa dónde metí el código.
En lugar de eso tienen la siguiente:
class User < ActiveRecord::Base
has_secure_password
validates_presence_of :password, :on => :create, :if => :password_required
# Associations
has_many :authentications
# Callbacks
before_validation :no_password_omniauth
# Gets set to true if the caller is trying to authenticate with omniauth.
@called_omniauth = false
# Build new omniauth users
def apply_omniauth(omniauth)
authentications.build(
:provider => omniauth['provider'],
:uid => omniauth['uid'])
self.first_name = omniauth['user_info']['first_name'] if self.first_name.blank?
self.last_name = omniauth['user_info']['last_name'] if self.last_name.blank?
self.email = omniauth['user_info']['email'] if omniauth['user_info']['email'] && self.email.blank?
@called_omniauth = true
end
def password_required
return false if @called_omniauth == true
(authentications.empty? || !password.blank?)
end
private
def no_password_omniauth
self.password_digest = 0 unless password_required
end
end
El método apply_omniauth se llama desde el controlador cuando alguien está tratando de autenticar o regístrate.
Gracias por la idea que lo ha enganchado.
Cambié la respuesta a la suya ya que proporcionó un ejemplo de código. Gracias. Supongo entonces que no le permitiría iniciar sesión en esa cuenta con ningún tipo de contraseña. –
Además, ¿para qué estás usando '@ called_omniauth' exactamente? ¿No solo usar 'authentications.empty? || ! password.blank? 'en su método' password_required' es suficiente? –
called_omniauth es la única forma en que su aplicación sabe que el usuario se está registrando a través de omniauth (mediante el método apply_omniauth). – chourobin
- 1. Rails 3.1 Mongoid has_secure_password
- 2. ¿Cómo funciona la sal en Rails 'has_secure_password
- 3. Crear rutas con nombre para OmniAuth en Rails 3
- 4. ¿Cómo hacer que Koala juegue bien con Omniauth?
- 5. Devise + Omniauth + fb_graph + Rails 3 Tutorial
- 6. Rails rspec y omniauth (pruebas de integración)
- 7. Mongoid y has_secure_password
- 8. Rails 3.1.1 has_secure_password digest no puede estar en blanco
- 9. Heroku, idearán: Getting 'NoMethodError (método no definido `to_key' para: usuario: Símbolo)'
- 10. Rails 3.2 + Devise 2.1 + OmniAuth + Backbone.js Autenticación
- 11. ¿Hay alguna omniauth para php?
- 12. Configuraciones de configuración para Omniauth a Google en Rails
- 13. Aplicación Getting Rails que se ejecuta en IronRuby Rack
- 14. Getting Rails 3 Generators with Rspec 2 and Mocha
- 15. has_secure_password: cómo solicitar la longitud mínima
- 16. (Ruby) Getting Net :: SMTP trabajando con Gmail ...?
- 17. Getting EasyMock simula objetos para lanzar excepciones
- 18. Construyendo una nueva estrategia para Omniauth, pero Omniauth no puede encontrarla
- 19. LabVIEW "driver" - getting started
- 20. Authenticate user from iOS Rails 3 server and Omniauth
- 21. signalR - getting username
- 22. Manejar OmniAuth :: Error (invalid_credentials) para Identity Login
- 23. Rails 3 obtener contactos de gmail usando omniauth?
- 24. OmniAuth + Identity Olvidé mi contraseña
- 25. + + OmniAuth Rememberable
- 26. Getting Spring Application Context
- 27. Cómo saltear las validaciones de has_secure_password
- 28. Rails 3. getting Errno :: EACCES Permiso Denegado al cargar archivos en producción
- 29. Rails - Facebook con Omniauth y Koala: Cómo renovar un token caducado
- 30. Facebook omniauth callback y #_
Voy a probar tu método, házmelo saber si encuentras una manera mejor. –
Parece la solución más fácil. Acabo de establecer 'user.password_digest = SecureRandom.urlsafe_base64' en mi método' from_omniauth'. (Aunque, después de volver a leer su respuesta, supongo que no tiene que ser aleatorizado porque no se está utilizando para la autenticación). Dado que esto es mucho más rápido, me pregunto cuál es la razón para optar por la respuesta aceptada. – umezo
Tienes razón. Seguí adelante y cambié la respuesta. Aunque todavía he optado por usar BCrypt directamente y escribir mis propios métodos de hash de contraseñas. Es muy fácil de hacer y aclara tus intenciones. –