Rails Devise: установить пароль reset и перенаправить пользователя
В моем приложении для определенного варианта использования я создаю нового пользователя (программно устанавливаю пароль) и отправляю им письмо с подтверждением.
Я бы хотел, чтобы они могли изменять свой пароль сразу после подтверждения (без необходимости вводить сгенерированную систему, которую я не хочу отправлять)
В сущности, я хотел бы
1) Система создает новую учетную запись пользователя с сгенерированным паролем.
2) Система отправляет подтверждение по электронной почте.
3) Подтверждение кликов пользователей и перенаправляется на ввод пароля (эффективно отправить их по URL-адресу, указанному ниже).
<a href="#" onclick="location.href='http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb'; return false;">Change my password</a>
Любая помощь/указатели будет отличной.
Ответы
Ответ 1
Простой способ иметь только один шаг для пользователей, чтобы подтвердить адрес электронной почты и установить начальный пароль, используя предложенную вами ссылку...
Отправляйте одно сообщение, которое генерирует ваше приложение, в том числе reset_password_token, и считайте, что пользователь владеет этим токеном, подтверждающим действительность этого адреса электронной почты.
В системном коде генерации учетных записей, при условии, что модель пользователя настроена с помощью: recoverable и: database_authenticatable. Модули разработки...
acct = User.new
acct.password = User.reset_password_token #won't actually be used...
acct.reset_password_token = User.reset_password_token
acct.email = "[email protected]" #assuming users will identify themselves with this field
#set other acct fields you may need
acct.save
Сделать настройку пароля reset немного более понятным для пользователей при установке начального пароля.
вид/Завещание/пароли/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.
Не нужно включать: подтверждаемый модуль разработки в модель пользователя, так как учетные записи, созданные вашим приложением, не будут доступны без пароля reset_password_token в письме.
Devise обработает отправку и очистит поле reset_password_token.
Подробнее о методах reset_password_token
и друзьях см. devise_gem_folder/lib/devise/models/recoverable.rb
и database_authenticatable.rb
.
Если вы хотите использовать модуль Devise :confirmable
, а не этот подход, см. страницу викторины.
Ответ 2
В 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 = '[email protected]'
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 %>
Ответ 3
Вы можете позвонить
user.send(:set_reset_password_token)
Он может быть нестабильным, так как это защищенный метод, но он может работать для вашего дела. Просто прикройте его тестом.
(проверено на Devise v. 3.4)
Ответ 4
Вот мой фрагмент для предварительного просмотра почтовой программы
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