OmniAuth и Devise, как установить дополнительные пароли - PullRequest
5 голосов
/ 20 февраля 2011

Я использую OmniAuth и Разработка для аутентификации пользователей.Я хотел бы, чтобы пользователи, которые зарегистрировались с помощью поставщиков OmniAuth, могли установить дополнительный пароль (необходимый для аутентификации API), но я вхожу в стену.

Если пользователь создает учетную запись через OmniAuth и пытаетсячтобы установить пароль, они получают следующую ошибку:

BCrypt::Errors::InvalidHash in RegistrationsController#update

Я считаю, что это потому, что пароль пуст.Какой хороший способ обойти это?Я думал о генерации случайного пароля, но проблема с этим подходом заключается в том, что пользователю необходимо знать текущий пароль для редактирования настроек.

Редактировать : я посмотрел на , позволяющий пользователю изменять настройки без необходимости ввода текущего пароля , и это то, что я хотел бы сделать только , еслиу пользователя изначально не было пароля.

Ответы [ 4 ]

5 голосов
/ 11 марта 2011

В качестве альтернативы можно добавить следующее в свой класс модели «пользователь», чтобы обойти проверку пароля, если нет пароля для проверки, где провайдер - это поле, которое задается при использовании внешней аутентификации.

def valid_password?(password)  
  !provider.nil? || super(password)  
end
3 голосов
/ 28 февраля 2011

Полагаю, вам не нужен простой выход, который состоял бы в том, чтобы просто сбросить пароль, если бы они хотели его установить?

user.send_reset_password_instructions

1 голос
/ 16 января 2013

Это немного поздно, но это может помочь кому-то еще, с помощью ответа Эндрю вы можете создать пароль и сохранить его в базе данных, но вы не можете войти в систему, используя свой адрес электронной почты и новый пароль, решив это, установив:

  def valid_password
    !provider.nil? && !encrypted_password.present? || super
  end
0 голосов
/ 19 мая 2011

Еще одна альтернатива. Вам не нужно включать новое поле. Просто поймайте возникшее исключение и верните false. Вот код.

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

Это должно сделать работу.

...