2011-02-20 21 views
5

Estoy usando OmniAuth y Devise para autenticar usuarios. Me gustaría que los usuarios que se hayan registrado utilizando los proveedores de OmniAuth puedan establecer una contraseña opcional (necesaria para la autenticación de la API), pero me encontraré con un muro.OmniAuth and Devise, cómo configurar contraseñas opcionales

Si un usuario crea una cuenta a través de OmniAuth y trata de establecer una contraseña que sale el siguiente error:

BCrypt::Errors::InvalidHash in RegistrationsController#update 

Creo que esto se debe a que la contraseña está en blanco. ¿Cuál es una buena forma de evitar esto? He pensado en generar una contraseña aleatoria, pero el problema con ese enfoque es que el usuario necesita saber la contraseña actual para editar la configuración.

Editar: me miraba allowing the user to change settings without requiring a current password y eso es lo que me gustaría hacer única si el usuario no tiene una contraseña inicialmente.

Respuesta

3

Supongo que no quiere la salida más fácil, que sería simplemente restablecer la contraseña si quisieran configurarla.

user.send_reset_password_instructions

+0

Sí, inicialmente no quería hacer eso, pero terminé haciéndolo de esa manera. – David

5

Una alternativa es añadir lo siguiente en la clase del modelo 'usuario' para omitir la comprobación de contraseñas si no hay contraseña para verificar, en donde el proveedor es algún campo que se establece cuando se utiliza la autenticación externa.

def valid_password?(password) 
    !provider.nil? || super(password) 
end 
0

Otra alternativa. No tiene que incluir un nuevo campo. Simplemente atrapa la excepción planteada y devuelve falso. Aquí está el código.

def valid_password?(password) 
    begin 
     super(password) 
    rescue BCrypt::Errors::InvalidHash 
     return false 
    end 
end 

Esto debería hacer el trabajo.

1

Esto llega un poco tarde pero podría ayudar a otra persona, con la respuesta de Andrew puede crear una contraseña y almacenarla en la base de datos, pero no puede iniciar sesión utilizando su correo electrónico y su nueva contraseña, solucionado esto estableciendo :

def valid_password 
    !provider.nil? && !encrypted_password.present? || super 
    end 
Cuestiones relacionadas