Rails Devise: установить токен сброса пароля и перенаправить пользователя - PullRequest
42 голосов
/ 05 мая 2011

В моем приложении для определенного случая использования я создаю нового пользователя (программно задаю пароль) и отправляю ему электронное письмо с подтверждением.

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

В действительности я хотел бы
1) Система создает новую учетную запись пользователя с сгенерированным паролем.
2) Системаотправляет электронное письмо с подтверждением.
3) Пользователь нажимает на подтверждение и перенаправляется для ввода своего пароля (фактически отправьте его по URL-адресу, как показано ниже)

<a href="http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb">Change my password</a>

Любая помощь / указатели будут хороши.

Ответы [ 4 ]

43 голосов
/ 12 мая 2011

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

Отправьте одно электронное письмо, сгенерированное вашим приложением, включая reset_password_token, и рассмотрите возможность владения пользователемподтверждения этого адреса электронной почты.

В коде генерации системной учетной записи предполагается, что модель пользователя настроена с: recoverable и: database_authenticatable Devise modules ...

acct = User.new
acct.password = User.reset_password_token #won't actually be used...  
acct.reset_password_token = User.reset_password_token 
acct.email = "user@usercompany.com" #assuming users will identify themselves with this field
#set other acct fields you may need
acct.save

Сделайте просмотр пароля сброса устройства немного более понятным для пользователей при установке начального пароля.

views / devise / passwords / edit.html.erb

...
<%= "true" == params[:initial] ? "Set your password" : "Reset your password" %>
...  

Сгенерированная электронная почта

Hi <%= @user.name %>
An account has been generated for you.
Please visit www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @user.reset_password_token %> to set your password.

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

Devise обработает отправку и очистит поле reset_password_token.

См. devise_gem_folder/lib/devise/models/recoverable.rb и database_authenticatable.rb для получения подробной информации о reset_password_token методе и друзьях.

Если вы хотитечтобы использовать модуль Devise :confirmable вместо этого подхода, см. вики-страницу Devise .

29 голосов
/ 23 августа 2014

В Rails 4.1 работает следующая модификация ответа Anatortoise House:

user = User.new
user.password = SecureRandom.hex #some random unguessable string
raw_token, hashed_token = Devise.token_generator.generate(User, :reset_password_token)
user.reset_password_token = hashed_token
user.reset_password_sent_at = Time.now.utc
user.email = 'user@usercompany.com'
user.save!
# Use a mailer you've written, such as:
AccountMailer.set_password_notice(user, raw_token).deliver

В представлении электронной почты есть эта ссылка:

www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @raw_token %>
2 голосов
/ 06 сентября 2015

Вот мой фрагмент для предварительного просмотра почтовой программы

class Devise::MailerPreview < ActionMailer::Preview
  def reset_password_instructions
    user = User.last
    token = user.send(:set_reset_password_token)
    Devise::Mailer.reset_password_instructions(user, token)
  end
end
2 голосов
/ 04 июня 2015

Вы можете позвонить

user.send(:set_reset_password_token)

Может быть нестабильным, так как это защищенный метод, но он может работать для вашего случая. Просто покройте это тестом.

(проверено на Devise v. 3.4)

...