2011-02-20 3 views
5

OmniAuthDevise을 사용하여 사용자를 인증합니다. OmniAuth 공급자를 사용하여 가입 한 사용자가 선택적 암호 (API 인증에 필요함)를 설정할 수 있지만 벽에 부딪 히고 싶습니다. 나는 암호가 비어 있기 때문입니다 생각OmniAuth 및 Devise, 선택적 암호 설정 방법

BCrypt::Errors::InvalidHash in RegistrationsController#update 

: 사용자가 OmniAuth를 통해 계정을 생성하고 다음과 같은 오류가 암호를 설정하려고하면

. 이 문제를 해결하는 좋은 방법은 무엇입니까? 난 임의의 암호를 생성하는 방법에 대한 생각했지만 그 접근법의 문제는 사용자가 설정을 편집하기 위해 현재의 암호를 알아야한다는 것입니다.

편집 : 나는 allowing the user to change settings without requiring a current password 쳐다 보면서 그것이 내가 사용자가 처음에 암호를 가지고 있지 않은 경우 에만을하고 싶은거야.

답변

3

설정하고 싶다면 간단히 비밀번호를 재설정하는 것이 쉬운 방법이 아니라고 생각합니까?

user.send_reset_password_instructions

+0

예 처음에 그렇게하고 싶지는 않았지만 그 방법으로 그렇게했습니다. – David

5

대안은 공급자가 외부 인증을 사용할 때 설정되어있는 일부 필드이고, 확인하는 암호가없는 경우 암호 검증을 우회하기 위해 '사용자'모델 클래스에 다음을 추가하는 것입니다.

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

또 다른 대안입니다. 새 필드를 포함 할 필요는 없습니다. 발생한 예외를 잡아서 false를 반환합니다. 여기에 코드가 있습니다.

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

이 작업을 수행해야합니다.

1

이것은 조금 늦었지만 다른 사람에게 도움이 될 수 있습니다. 앤드류의 대답으로 암호를 만들어 데이터베이스에 저장할 수 있지만 전자 메일과 새 암호를 사용하여 로그인 할 수는 없습니다 :

def valid_password 
    !provider.nil? && !encrypted_password.present? || super 
    end 
관련 문제