Подтвердить что ты не робот

Избегайте входа в систему после того, как нажмите ссылку подтверждения, используя драгоценный камень разработки?

Я использую devise gem, после нажатия на ссылку подтверждения, я хочу напрямую войти в систему. В настоящее время он просит снова зарегистрироваться.

Недавно я добавил в файл инициализации:

config.allow_insecure_token_lookup = true
config.secret_key = 'a8d814803c0bcc735ce657adc77793459d00154cdd7532c13d3489600dc4e963f86e14beb593a32cbe9dbbe9197c9ce50a30102f363d90350052dc8d69930033'

Любые предложения?

4b9b3361

Ответ 1

В предыдущих версиях Devise пользователь был автоматически подписан после подтверждения. Это означало, что любой, кто мог бы получить доступ к электронному письму с подтверждением, мог бы войти в учетную запись someones, просто щелкнув ссылку.

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

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

По этой причине Devise 3.1 больше не подписывает пользователя автоматически после подтверждения. Вы можете временно вернуть старое поведение после обновления, установив в config/initializers/devise.rb следующее:

config.allow_insecure_sign_in_after_confirmation = true

Эта опция будет доступна только временно, чтобы помочь миграции.

Ответ 2

Флаг config.allow_insecure_sign_in_after_confirmation больше не поддерживается в Devise.

Пока вы должны знать о возможных проблемах безопасности при автоматической регистрации пользователей, когда они подтверждают свою учетную запись (http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/), для некоторых приложений преимущество в терминах пользовательский опыт может стоить компромисса с безопасностью.

В конце концов, риск безопасности заключается в том, что: a) пользователь неправильно вводит свою электронную почту, b) они не сразу исправляют свою ошибку, c) набранное им электронное письмо соответствует действующему и действующему электронному письму, d) лицу который неправильно получает письмо, открывает его и нажимает на ссылку.

Если это приемлемый профиль риска для вашего приложения, вы можете переопределить программу ConfirmationsController:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])
    yield resource if block_given?

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_flashing_format?
      sign_in(resource) # <= THIS LINE ADDED
      respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
    end
  end
end

И пройдите к нему в routes.rb:

devise_for :users, controllers: { confirmations: 'confirmations' }

Ответ 3

В более поздних версиях Devise вы можете сделать следующее.

конфиг/routes.rb:

devise_for :users, controllers: { confirmations: 'users/confirmations' }

приложение/контроллеры/пользователи/confirmations_controller.rb:

class Users::ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      sign_in(resource)
    end
  end
end

Ответ 4

Глядя на ответ mb21, он должен быть

def show
  super do |resource|
    if resource.confirmation_sent_at > DateTime.now-2.hours && resource.errors.empty?
      sign_in(resource)
    end
  end
end

confirm_sent_at - это время, когда электронное письмо было отправлено пользователю, а не confirm_at, которое является моментом, когда пользователь нажимает на ссылку, которая всегда находится в пределах 2 часов на сервере, когда это происходит...

Ответ 5

Мы хотели, чтобы пользователь автоматически входил в систему, если она нажимает на ссылку в письме через 2 часа после создания пользователя. Основываясь на ответе @Sjor, мы пошли с:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      if resource.confirmed_at > DateTime.now-2.hours && resource.errors.empty?
        sign_in(resource)
      end
    end
  end
end