Как добавить пользователей только с электронной почтой в Devise

#ruby-on-rails #devise #subscribe

#ruby-on-rails #разработка #Подписка

Вопрос:

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

Я могу добавить свои собственные настройки проверки, чтобы разрешить это, но я подозреваю, что это повлияет на работу остальной части Devise, если я начну добавлять пользователей без паролей или помечать их своим собственным полем «незарегистрированные».

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

Ответ №1:

У меня есть приложение, которое делает нечто подобное — мы используем Open ID и OAuth исключительно для входа в систему, и хотя мы храним адрес электронной почты пользователя (учетная запись Google или Facebook отправляет его обратно во время аутентификации), они никогда не входят в систему с его помощью и поэтому не имеют / нуждаются в пароле.

Это обратный вызов для того, что происходит, когда пользователь регистрируется через Facebook:

   User.create!( :facebook_id => access_token['uid'],
                :email => data["email"], 
                :name => data["name"], 
                :password => Devise.friendly_token[0,20])
  

Devise.friendly_token[...] Просто генерирует случайный пароль из 20 символов для пользователя, и мы отлично используем нашу пользовательскую модель по умолчанию с devise. Моим подходом было бы просто установить пароль аналогичным образом для ваших пользователей, поскольку вы никогда не собираетесь использовать их пароль. Кроме того, если вы когда-нибудь передумаете и захотите, чтобы они могли входить в систему, вы можете просто изменить пароль пользователя в базе данных и создать форму входа, а devise позаботится обо всем остальном.

Комментарии:

1. подсказка, мне действительно нравится это решение

2. Это звучит как прекрасный подход, который я попробую. Тем не менее, я намерен предложить как подписку (только по электронной почте), так и регистрацию (электронная почта и пароль). Если у меня есть пользователь, который подписывается, и я устанавливаю пароль для этого токена, я предполагаю, что devise будет рассматривать этого пользователя как зарегистрированного пользователя, поэтому потребует от пользователя подтверждения своей личности по электронной почте, что может немного сбить с толку пользователя, который ранее подписывался только на свой адрес электронной почты.

3. Извините, чтобы прояснить это.. Если у меня есть пользователь, который подписывается, и я устанавливаю пароль для этого токена, я предполагаю, что devise будет рассматривать этого пользователя как зарегистрированного пользователя, поэтому потребует от пользователя подтверждения своей личности по электронной почте при попытке регистрации .

4. Я реализовал это, и это заставляет меня двигаться, однако, я думаю, мне нужно внедрить флаг subscriber_only в таблице user, который контроллер create будет использовать для определения, действительно ли пользователь зарегистрирован или просто «подписчик». Я покопался в коде devise и решил, что пока могу смириться с этим, и вернусь к этому позже. Спасибо, Бретт.

5. Как мы можем гарантировать, что пароль, сгенерированный (при создании пользователя), каждый раз уникален. есть ли способ передать соль (скажем, электронную почту) и убедиться, что сгенерированные пароли уникальны

Ответ №2:

Другой вариант в дополнение к ответу Бретта — переопределить password_required? метод в пользовательской модели.

 def password_required?
    super amp;amp; provider.blank?
end
  

Если вы храните более одного поставщика omniauth, то что-то подобное также должно работать.

 def password_required?
    super amp;amp; self.omniauth_credentials.empty?
end
  

Полностью отдаю должное railscast Райана Бейтса на Devise и Omniauth за это решение: http://railscasts.com/episodes/235-devise-and-omniauth-revised