Вход в уже существующего пользователя с новым методом Omniauth - PullRequest
0 голосов
/ 29 января 2019

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

  def self.from_omniauth(auth)
    if user = User.find_by(email: auth.info.email)
      user.provider    ||= auth.provider
      user.uid         ||= auth.uid
      user.first_name  ||= auth.info.first_name   
      user.last_name   ||= auth.info.last_name   
      user.save
      user
    elsif user = User.create(provider: auth.provider, uid: auth.uid)
      user.email = auth.info.email
      user.password = Devise.friendly_token[0,20]
      user.first_name = auth.info.first_name   
      user.last_name = auth.info.last_name   
      user.save 
      user
    end
  end

Кажется, он работает нормально, хотя мои тесты довольно просты.У меня просто несколько вопросов, я относительно программист-любитель и ценю мудрость тех, у кого есть опыт, чтобы знать не просто «как», а «как лучше».

  1. Является ли этообычная и "легальная" практика? Может быть, есть какая-то проблема конфиденциальности или "лучшей практики", о которой я не думаю?

  2. Есть ли способ объединить find_by и * 1013?* звонит, две ветви моего if/elsif заявления? На самом деле, этот пост имеет отличный ответ при использовании tap. Есть ли причина не делать этого?

  3. Каков обычный способ сделать это с более чем одним провайдером (например, если пользователь, о котором мы говорим, зарегистрировался по электронной почте, затем вошел в Facebook, а затем вошел в Google)?либо хеш, либо целый другой объект ActiveRecord. (можете ли вы даже сохранить хеш как свойство объекта ActiveRecord?)

Надеюсь, можно написать вопрос, который не соответствуетточно проблема. Спасибо за совет!

1 Ответ

0 голосов
/ 29 января 2019

1 ) Я сделал то, что ты сделал, и не думаю, что это проблема предметно.Наличие двух пользователей с одним и тем же адресом электронной почты может стать проблемой для управления по мере роста базы пользователей.

2 ) Вы можете использовать find_or_create_by, то есть:

 def self.from_omniauth(auth)
   user = User.find_or_create_by(email: auth.info.email) do |u|
     u.provider = auth.provider
     u.uid = auth.uid
     ...
   end
 end

См. документы

3 ) ActiveRecord поддерживает сохранение hash в столбце.https://api.rubyonrails.org/classes/ActiveRecord/Store.html содержит подробные сведения о том, как этого добиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...