  サインイン | 登録

  1. ホーム
  2. 
  3. プログラミング
  4. 
  5. Ruby on Rails
  6. 

Ruby on Rails でDevise、ActiveModel::Otp、rqrcodeとグーグル認証システムによる二段階認証の実装の仕方

2020/06/27 更新 2020/07/22
Makio
ID、パスワードによるサインインだけでは非常に脆弱で、今はTwitter、Facebook等のSNS、グーグル、アマゾン、マイクロソフトのアカウントなどが二段階認証を取り入れれいます。

この記事ではRuby on Railsで作られたサイトに、Devise、ActiveModel::Otp 、rqrcode及びグーグル認証システムによって二段階認証を実装する仕方を、段階を追って解説します。

ユーザーにとって、グーグル認証システムはアンドロイドでもアイフォーンで利用可能ですし、テキストで携帯に送られるOTPによる二段階認証よりも実装しやすいと思います。

https://d6ysb2xoqnc13.cloudfront.net/images/9365/original/2d9b96


devise、active_model_opt、rqrcode gemをインストール


まずは必要なgemを追加します。





users_controller.rbのアップデート


ここでは devise gemによって作成されるusers_controller.rbに2つの機能を追加します。

  • 二段階認証を有効化するページの対応。有効化ページにはrqrcode gemによって作られたQRコードを表示します。このQRコードをグーグル認証システムで読むことになります。def activate_2faがその実装です
  • ユーザーが二段階認証コード、つまりワンタイムパスワード(OTP)を送った時に、有効化のプロセスの対応。def activate_2fa_updateがその実装




二段階認証有効化ページ




users_controller.rbにあるdef activate_2fa によって作られるQRコードを表示するためのページです。ユーザーが、このQRコードをグーグル認証システムで読み込んでワンタイムパスワード(OTP)を得られます。

html_safe on @svgを読み込んでQRコードを表示させます。

ユーザーが送ったワンタイムパスワードはusers_controller.rb のdef activate_2fa_update で対応します。



devise gemのsessions_controller.rbのアップデート 


ユーザーが二段階認証をセットアップ完了後は、サインインプロセスは以下2段階となります。

  • IDとパスワードによる承認
  • グーグル承認システムによるワンタイムパスワードによる承認

このプロセスに対応するようにsessions_controller.rbをアップデートします。




ここで行われているのは

  • def createのオーバーライト
  • ID、パスワードの承認が行われた後の対応
  • ワンタイムパスワードを入力した後の対応
  • ワンタイムパスワードの入力失敗は5回まで
  • それぞれのプロセスで非承認のときはサインインページに転送



ワンタイムパスワードを入力するページ


ワンタイムパスワードを入力ページのテンプレート。



ユーザーのメールアドレスを隠しフィールドで使っています。



最後に


deviseによる二段階認証を実装すると言っているgemを色々と試したのですが、どれも上手くいきませんでした。

ActiveModel::Otpを使って、根本的に対応することで上手くいきました。

一番難しかったのは、やはりActiveModel::Otp と Devise での連携でしたが、ここをGemを使ってあれこれ出てくるエラーを直すより、自分でロジックを組んだほうが結局早かったです。



おまけ

ちなみに、この123ishのサイトはRuby on Railsで作られています。





#two-factor-authentication, #123ish, #ruby-on-rails, #実装の仕方, #二段階認証
スコアー: 1.06
 コメント
 1 いいね
0
  信用しますか?  
0

    


NFT 123ish 3次元ゴールドコインアートコレクション




人気のコメント
最初にコメントする

ボード


サインインしてコメントを投稿する


Ruby on RailsでAMPページを作る方法

Ruby on Railsのコードに潜むN+1クエリ問題をBullet gem で発見して、Railサイトのレスポンスを最適化

RailsアプリケーションでSporocketsからWebpackerへ移行する方法

Railsアプリケーションでのjquery-ujsからrails-ujsへの移行の仕方

Railsサイトで、friendly_id gemを使って日本語のフレンドリーURLを表示させる方法

知っているとお得な情報について書ける方を募集しています!

大籠のキリシタン〜東北のキリシタン殉教の地「大籠」、千松兄弟とは

大籠のキリシタン殉教と千松兄弟に託されたメッセージ

ぎっくり腰には、早めの非ステロイド性抗炎症薬の服用が回復に良いのでしょうか?

東北の隠れキリシタンの里大籠を、地元自治会作製の「キリシタン殉教とたたら製鉄の里大籠散策マップ」により紹介

グランド・ナレーティブ 大いなる物語 アメリカは何処に行くのだろうか?

政治的独立と信教の自由

地元観光地図よる生月のキリシタン巡礼地

【Webライティング・コンテンツ作製のコンペティション】第一回123ish杯 123ishでの投稿記事のコンペティション 🥇1位4万円 🥈2位2万円 🥉3位1万円

Upworkでの支払い、返金に関するトラブルはどう対応できるか?

プログラマーは簡単な英語の読み書きで、Upworkのフリーランスとしてより稼げるようになる

生月に永遠に刻まれたキリシタン信仰の壮絶なドラマ

信徒発見と信教の自由

アメリカでの日系老人介護施設費用

データサイエンティスト・データサイエンス職よりデータエンジニアでの転職の方が手堅い?未経験者がデータエンジニアになる方法を教えます。

有名ブログのUbersuggestによる月間オーガニックトラフィックでのランキングと分析

第一回123ish杯コンペティションの結果発表

【Webライティング・コンテンツ作製のコンペティション】第2回123ish杯 投稿記事コンペティション

未経験からデータサイエンティストとして転職を成功させる方法。データサイエンスでの華やかな道と手堅く成功させる道を教えます

プライバシー設定を変更しました

記事は保存されました(投稿はされていません)

サインインして続行する

国: 日本 (jp)
  • United States (us)
  • 日本 (jp)
  • Indonesia (id)
  • India (in)
利用規約 | プライバシーポリシー | 私達に関して
よくある質問 | お問い合わせ
 
© 2025 123ish