38

gemを使用deviseしています。確認リンクをクリックした後、直接サインインしたいです。現在、再度サインインするよう求められています。

最近、devise の初期化ファイルに以下を追加しました。

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

助言がありますか?

4

6 に答える 6

61

以前の Devise バージョンでは、ユーザーは確認後に自動的にサインインしていました。これは、確認メールにアクセスできる人なら誰でも、リンクをクリックするだけで誰かのアカウントにサインインできることを意味していました。

ユーザーを自動的にサインインさせることも、電子メールの再確認ワークフローで有害になる可能性があります。ユーザーが自分の電子メール アドレスを変更することを決定し、その途中で新しい電子メール アドレスに入力ミスをしたとします。電子メールが別のアドレスに送信され、トークンを手にすると、そのアカウントにサインインできるようになります。

ユーザーが電子メールをすぐに修正しても、害はありません。しかし、そうでない場合、他の誰かがそのアカウントにサインインする可能性があり、ユーザーはそれが起こったことを知りません.

このため、Devise 3.1確認後にユーザーが自動的にサインインすることはなくなりました。config/initializers/devise.rb で次のように設定することで、アップグレード後に一時的に古い動作に戻すことができます。

config.allow_insecure_sign_in_after_confirmation = true

このオプションは、移行を支援するために一時的にのみ使用できます。

于 2013-09-06T10:42:43.920 に答える
53

この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' }
于 2014-01-06T23:12:43.850 に答える
16

Devise の最近のバージョンでは、次のことができます。

config/routes.rb :

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

app/controllers/users/confirmations_controller.rb :

class Users::ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      sign_in(resource)
    end
  end
end
于 2014-09-16T09:44:34.980 に答える
3

mb21の答えを見ると、そうあるべきです

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

Confirmation_sent_at は、メールがユーザーに送信された時刻です。confirmed_at とは対照的に、ユーザーがリンクをクリックした瞬間です。これは、サーバー上で現在から 2 時間以内に発生します...

于 2016-05-18T04:27:41.910 に答える