LoginSignup
15

More than 5 years have passed since last update.

posted at

Railsの二段階認証Gem Devise-Two-FactorのDemoを触ってみた

Railsにおける二段階認証

二段階認証を実装しやすくするGemは何種類か出回ってるようです。信頼感あるWEBサービスには、だいたい二段階認証機能が付いているんではないでしょうか?

この二つで迷ったのですが、プロジェクトでDeviseを使っているなら、Devise-Two-Factorのほうが相性いいんじゃないの?
ということでDevise-Two-Factorを採用することにしました。

実際にはDevise-Two-Factorはrotpをラップしたもので、ハッシュ値の作成時にもrotpが使用されています。

弊社のプロダクトに組み込んだら、また別にまとめを作ろうと思います。

環境・バージョン

Mac OS Ⅹ Yosemite
Rails: 4.1.0
Ruby: 2.1.5p273

手順

普通にレポジトリからgit cloneで落としてきて、とりあえずデフォルトのGemfileでbundle installしてみました。

するとpg(PostgreSQL)のconfigファイルがないやらでめっちゃ怒られます。PostgreSQLについてあまり明るくないので、自分はお手軽なSQLite3に変更しました。

DemoのデフォルトのDBがPostgreSQLになってます。コメントアウトしてSQLiteに変えちゃいましょう。

Gemfile
# gem 'pg'
gem 'sqlite3'
config/database.yml
default: &default
  adapter: sqlite3 # postgresql
  encoding: unicode
  # For details on connection pooling, see rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: 5

次にコマンドライン操作に移ります。

  1. Demoディレクトリでbundle install

  2. bundle exec rake db:migrateでDB,テーブルを作成します。

  3. rails cUserと入力し、ちゃんと属性が付いてるか確かめてみましょう。

image

  1. rails sでサーバー起動します。デフォルト3000番ポートを他プロジェクトで使っていたのでrails s -p 3003で3003番にアクセス。

  2. http://localhost:3003 にアクセス

すごくシンプルですが、無事ブラウザで表示されました。
Sign upしてみましょう。

image



image


image


ログインに成功すると、Enable 2FAのボタンが出現します。

image

users_controller.rb
class UsersController < ApplicationController
  #
  #  other code...
  #
  def enable_otp
    current_user.otp_secret = User.generate_otp_secret
    current_user.otp_required_for_login = true
    current_user.save!
    redirect_to home_index_path
  end
end

二段階認証を有効化するのはenable_otpメソッドです。
User.generate_otp_secretでハッシュ値を作成して保存しています。

Enable 2FAを押してみましょう!


スクリーンショット 2015-09-18 16.10.32.png
Demoにはハッシュ値をQRコードに変換してくれるgem 'rqrcode-rails3'が入っています。 
最初からQRコードを生成してくれるようにViewに記載してあるので、Enable 2FAで次の画面に遷移するだけでQRコードが表示されます。

index.html.erb

<% if current_user.otp_required_for_login %>
    <%= button_to "Disable 2FA", users_disable_otp_path, :method => :post %>
    <%= raw RQRCode::render_qrcode(current_user.otp_provisioning_uri(current_user.email, issuer: "Devise-Two-Factor-Demo"),
                                   :svg,
                                   :level => :l,
                                   :unit => 2) %>


これをGoogleAuthenticatorで読み取ってみると...

FullSizeRender.jpg

やったぜ。
ここに表示されているアドレスは別の時にキャプチャしたものなので違ったものが入力されていますが、実際はサインアップ時に登録したアドレスが表示されます。

このワンタイムパスを入力することで、二段階認証が完了します。
一度ログアウトして、ちゃんと表示された番号でログインできるか確かめてみましょう。

まとめ

Deviseでログイン認証とかセッション管理してるなら、おすすめのGemだと思います。

もしSMSなどで番号を端末に通知する、などの機能を付けたい場合は各携帯キャリアへの料金や通信が発生するので、別サービスとの契約が必要です。
最近はTwilioなどがよく使われているみたいですね。
Twilio for KDDI Web Communications | クラウド電話API

QiitaやGithubも二段階認証を実装しているので、ぜひやってみるといいかもしれません!セキュリティが非常に大事なファクターである時代ですから...

それではまた。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
15