Deviseで認証機能を実装する

背景

Webアプリケーションの作成の際、ユーザー認証機能の実装は全て自分で実装しようとすると大変な物になります。
今回はrailsアプリケーションにdevisegemを用いて認証機能の実装を行います。

Railsアプリケーションの作成

gemを管理するためにbundlerで初期化を行います。

bundle init

作成されたGemfileにrailsを追加します。

Gemfile

gem 'rails'

bundlerを用いてrailsをインストールし、その後railsアプリケーションのひな形を作成します。
今回はデータベースにMySQLを指定しています。

bundle install --path vendor/bundle
bundle exec rails new . --skip-bundle -d mysql

次にGemfileにgem 'devise'を追加し、再度bundleコマンドでgemをインストールします。

ユーザー認証機能の初期化

以下コマンドでrailsアプリケーションにdeviseの初期設定を行います。

bundle exec rails generate devise:install

すると、以下のメッセージが表示されます。

      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying on Heroku with Rails 3.2 only, you may want to set:

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.

  5. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================

1はメールアドレス認証機能を有効化した際の案内メールに記載されるURLに関してのオプションです。
実際の運用でメールアドレス認証機能を有効化した時にはconfig/environments/production.rbも編集が必要です。

2はトップページの指定を、3はメッセージ出力用タグの設置を意味しています。

4はHerokuを用いるときの注意で、5はviewをカスタマイズするときの方法を表しています。

ユーザーモデルの作成

次にユーザーのモデルを作成します。
今回は認証に用いるモデルをmemberとし、memberモデルとviewの作成を行ってみます。

bundle exec rails g devise member
bundle exec rails g devise:views members

メール認証機能の有効化

メール認証機能を有効化するには、migrationファイルで、## Confirmableをアンコメントし、memberモデルに:confirmableを追加します。

db/migrate/2013xxxxxxxxxx_devise_create_members.rb

## Confirmable
t.string   :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string   :unconfirmed_email # Only if using reconfirmable

app/models/member.rb

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

deviseを初期化した際のメッセージに従い、mailer.default_url_optionsを設定し

config/environments/development.rb

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

viewもカスタムしたものを見に行くように変更します。

config/initializer/devise.rb

config.scoped_views = true

ユーザー認証を試す

これだけでユーザー認証機能が作成できたので、railsサーバーを起動してみます。

bundle exec rails s

ユーザー認証ページ(http://localhost:3000/members/sign_up)にアクセスします。

Sent mail to hoge@gmail.com (20.9ms)
Date: Mon, 23 Sep 2013 18:51:38 +0900
From: please-change-me-at-config-initializers-devise@example.com
Reply-To: please-change-me-at-config-initializers-devise@example.com
To: hoge@gmail.com
Message-ID: <52400f2a2ed81_41aa3fc8b1cf335c8676c@MBA.local.mail>
Subject: Confirmation instructions
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<p>Welcome hoge@gmail.com!</p>

<p>You can confirm your account email through the link below:</p>

<p><a href="http://localhost:3000/members/confirmation?confirmation_token=839QMxew4ifNpj1cxFta">Confirm my account</a></p>

   (0.5ms)  COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 1135ms (ActiveRecord: 3.7ms)


Started GET "/" for 127.0.0.1 at 2013-09-23 18:51:38 +0900
Processing by Rails::WelcomeController#index as HTML
  Rendered vendor/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/templates/rails/welcome/index.html.erb (0.9ms)
Completed 200 OK in 5ms (Views: 3.7ms | ActiveRecord: 0.0ms)

するとコンソールにユーザー登録の際に送信されるメッセージが流れてくるので、そこに記載されているメールアドレス認証URLを叩きます。
http://localhost:3000/members/confirmation?confirmation_token=839QMxew4ifNpj1cxFta

メールアドレス認証が完了した後は、
http://localhost:3000/members/sign_inからログインすることが可能になっています。