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
からログインすることが可能になっています。