2011-02-20 12 views
5

Używam OmniAuth i Devise do uwierzytelniania użytkowników. Chciałbym, aby użytkownicy, którzy zarejestrowali się za pomocą dostawców OmniAuth, mogli ustawić opcjonalne hasło (wymagane do uwierzytelniania API), ale korzystam z niego na ścianie.OmniAuth i Devise, ustawianie opcjonalnych haseł

Jeśli użytkownik tworzy konto poprzez OmniAuth i próbuje ustawić hasło to pojawia się następujący błąd:

BCrypt::Errors::InvalidHash in RegistrationsController#update 

wierzę, to dlatego, że hasło jest puste. Co to jest dobry sposób? Myślałem o generowaniu losowego hasła, ale problem z tym podejściem polega na tym, że użytkownik musi znać aktualne hasło w celu edycji ustawień.

Edit: Spojrzałem na allowing the user to change settings without requiring a current password i to co chciałbym robić tylko, jeśli użytkownik nie ma hasła początkowo.

Odpowiedz

3

Zakładam, że nie chcesz łatwego wyjścia, które byłoby po prostu zresetować hasło, jeśli chcesz go ustawić?

user.send_reset_password_instructions

+0

Tak, początkowo nie chciałem tego robić, ale skończyło się to w ten sposób. – David

5

Alternatywą jest dodanie następujących do swojej „user” klasie modelu ominąć weryfikację hasła, jeśli nie ma hasła, aby sprawdzić, gdzie usługodawca ma pewne pole, które jest ustawione przy użyciu uwierzytelniania zewnętrznego.

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

Kolejna alternatywa. Nie musisz uwzględniać nowego pola. Po prostu wychwyć wyjątek podniesiony i zwróć false. Oto kod.

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

To powinno załatwić sprawę.

1

Trochę za późno, ale może pomóc komuś innemu, z odpowiedzią Andrzeja można utworzyć hasło i zapisać je w bazie danych, ale nie można zalogować się przy użyciu adresu e-mail i nowego hasła, rozwiązać to przez ustawienie :

def valid_password 
    !provider.nil? && !encrypted_password.present? || super 
    end 
Powiązane problemy