Edited at

Deviseのconfirmable - 確認メールのリンクをクリックしたら即サインインする

More than 3 years have passed since last update.

Screenshot 2015-08-02 15.53.07.png


前提

Deviseで認証するRailsアプリでUserモデルにconfirmableモジュールが実装されている。


やりたいこと

ユーザーが確認メールにあるリンクをクリックしたら即サインインできるようにしたい。


やりかた

ConfirmationsController#showをオバーライドする。

サインインさせたいタイミングでsign_in(resource)を呼ぶ。


/app/controllers/confirmations_controller.rb

# Override

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) # この一行を加えるのみ

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


deviseネームスペース外に存在するconfirmations_controller.rbについてDeviseに知らせるため、devise_forに登録する。


/config/routes.rb

Rails.application.routes.draw do

# ...

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

# ...
end



潜在的危険性

ユーザーが新規登録時に間違ったemailアドレスを記入した場合、たまたまそのemailを受け取った第三者にアカウントを乗っ取られてします可能性がある。


参考文献