4

КонтроллерРазрабатывают пароль сброса маркер недействительным

def create 
# admin manually creates user 
UserMailer.reset_password_instructions(@user).deliver 
end 

user.rb

class User < ActiveRecord::Base 

    before_create :generate_reset_password_token # generating devise reset token 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable and :omniauthable 
    # :registerable, 
    # :trackable, 
    devise :database_authenticatable, 
      # :confirmable, 
      :rememberable, 
      :validatable, 
      :recoverable, 
      :trackable, 
      :timeoutable 


private 

    # Generates a new random token for confirmation, and stores 
    # the time this token is being generated 
    def generate_reset_password_token 
    raw, enc = Devise.token_generator.generate(self.class, :reset_password_token) 
    @raw_confirmation_token = raw 
    self.reset_password_token = enc 
    self.reset_password_sent_at = Time.now.utc 
    end 

end 

user_mailer.rb

class UserMailer < ApplicationMailer 
    include Devise::Mailers::Helpers 

    default from: '[email protected]' 

    def reset_password_instructions(resource, opts={}) 
    @resource = resource 
    @token = @resource.reset_password_token 
    mail(to: @resource.email, subject: "Reset Password Instructions") 
    end 
end 

reset_password_instructions.html.erb

<p>Hello <%= @resource.email %>!</p> 

<p>Someone has requested a link to change your password. You can do this through the link below.</p> 

<p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p> 

<p>If you didn't request this, please ignore this email.</p> 
<p>Your password won't change until you access the link above and create a new one.</p> 

В этот момент, когда пользователь создается вручную администратором, Password reset Link собирается на адрес электронной почты, который я могу видеть, используя MailCatcher или letter_opener. http://lvh.me:3000/users/password/edit?reset_password_token=6a8bc4683fc9e5dfcc789f94f9b6bd2b1c44fd857f13662d0f0d1f6212022f81

Я нажимаю на ссылку, и она успешно провела меня до . Когда я отправляю форму, идентификация не удалась с сообщением Reset password token is invalid.

Что я здесь отсутствует ....

UPDATE:

Мои Development.rb выглядит следующим образом:

Rails.application.configure do 
    # Settings specified here will take precedence over those in config/application.rb. 

    # In the development environment your application's code is reloaded on 
    # every request. This slows down response time but is perfect for development 
    # since you don't have to restart the web server when you make code changes. 
    config.cache_classes = false 

    # Do not eager load code on boot. 
    config.eager_load = false 

    # Show full error reports and disable caching. 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 

    # Don't care if the mailer can't send. 
    config.action_mailer.raise_delivery_errors = false 

    # Print deprecation notices to the Rails logger. 
    config.active_support.deprecation = :log 

    # Raise an error on page load if there are pending migrations. 
    config.active_record.migration_error = :page_load 

    # Debug mode disables concatenation and preprocessing of assets. 
    # This option may cause significant delays in view rendering with a large 
    # number of complex assets. 
    config.assets.debug = true 

    # Asset digests allow you to set far-future HTTP expiration dates on all assets, 
    # yet still be able to expire them through the digest params. 
    config.assets.digest = true 

    # Adds additional error checking when serving assets at runtime. 
    # Checks for improperly declared sprockets dependencies. 
    # Raises helpful error messages. 
    config.assets.raise_runtime_errors = true 

    # Raises error for missing translations 
    # config.action_view.raise_on_missing_translations = true 

    # Configure letter opener to open email in browser 
    # config.action_mailer.delivery_method = :letter_opener 
    config.action_mailer.delivery_method = :smtp 
    config.action_mailer.smtp_settings = { :address => "lvh.me", :port => 1025 } 
    config.action_mailer.default_url_options = { host: 'lvh.me', port: 3000 } 

    config.domain = 'lvh.me' 
end 
+0

Как выглядит ваш development.rb? – Sylar

+0

Удалите 'config.domain' и добавьте' config.action_mailer.default_url_options = {: host => 'localhost: 3000'} 'Посмотрите, что произойдет. Сначала перезапустите сервер. – Sylar

+0

Нет, это не решило мою проблему. 'config.domain' - это только переменная конфигурации, которую я использую для установки сеанса в session_store, что-то вроде:' domain: Rails.configuration.domain'. – przbadu

ответ

3

Был код один линия мое решение, которое я усложнил, добавив ручную рассылку, действия и т. д.

Чтобы решить эту проблему, я должен только назвать Разрабатывают-х send_reset_password_instructions в user объекта:

В контроллере

@user.send_reset_password_instructions 

решить мою проблему.

Я очистил мой код путем удаления (как на мой вопрос :)

  • user_mailer.rb файл является не более обязательным, поэтому его удалил

  • views/user_mailer/reset_password_instructions.html.erb файл не требуется, поэтому удален Это.

  • User.rb модель, удалите before_action :generate_reset_password_token а также generate_reset_password_token частный способ.

  • Удалить ниже почтовой линии от контроллера

    UserMailer.reset_password_instructions(@user).deliver

3

я сошел с ума глубоко с этим, и, наконец, нашел ответ:

def generate_reset_password_token 
    raw, enc = Devise.token_generator.generate(self.class, :reset_password_token) 
    @raw_confirmation_token = raw 
    self.reset_password_token = enc 
    self.reset_password_sent_at = Time.now.utc 
    end 

Этот код является правильным, вы хотите user имеет enc как reset_password_token. Также хорошо, что вы сохраняете переменную raw.

class UserMailer < ApplicationMailer 
    include Devise::Mailers::Helpers 

    default from: '[email protected]' 

    def reset_password_instructions(resource, opts={}) 
    @resource = resource 
    @token = @resource.reset_password_token 
    mail(to: @resource.email, subject: "Reset Password Instructions") 
    end 
end 

В этой части вы хотите @token = @raw_confirmation_token (raw от маркеров генератора), а не @resource.reset_password_token (который enc от генератора).

Я считаю, что это решение предназначено для разработки версии 3.1+, похоже, они изменили настройку для дополнительной безопасности, не объясняя двух токенов.

Смежные вопросы