Laravelに2段階認証システムを導入する(Google2FA)

laravel-google2fa
  • URLをコピーしました!

何かとセキュリティが問われる昨今、これまでのIDパスワードだけの認証では不安を感じている方も多々いると思います。
近年、もしかしたら皆さんもご存知か、既に使われているかもしれませんが、ワンタイムパスワードを利用した2段階認証というものがあり、今回はそれをLaravelに導入していきます。

目次

2段階認証とは?

2段階認証は、さまざまなオンラインサービスで使われています。
ユーザーに2種類の認証情報を要求することにより、アカウントへログインする際のセキュリティを強化するのが目的です。
1段階目で要求される認証情報は、パスワードであることが一般的です。
2段階目で要求される認証情報はさまざまですが、最も一般的なのは、SMSかメールで送られてくるコードです。
2段階認証の根底にあるのは、ログインするには何かを「知って」いて、何かを「持って」いなければならない、という論理です。

引用:2段階認証とは何か?どんなアカウントで使うべきか? – カスペルスキー公式ブログ

2段階認証システムを導入する方法

SMSを送信するシステムだとお金かかるし、メールが溜まるのも嫌なので、使用するパッケージは「Google Two-Factor Authentication(以下、Google2FA)for Laravel」を採用しました。
何より、あのGoogle先生が提供しているので何かと安心です。
今回はそのモジュールをサーバー側に組み込み、iOSAndroidで無料でダウンロードできアプリGoogle Authenticator」を利用して実装します。

パッケージのインストール

それでは、いつのようにComposerを使用してパッケージをインストールしましょう。
これが2段階認証を実装してくれるGoogle2FAパッケージです。

次にQRコードを作成してくれるパッケージも入れておきます。
これはなくてもいいですが、ユーザーがアプリで設定する際、非常に便利になりますので、ぜひインストールしておきましょう。

Laravel 5.5は他に何もする必要はありませんが、Laravel 5.4以下はconfig/app.phpのprovidersとaliasesに追加してください。
最後に設定ファイルを公開して完了です。

フィールド追加とモデル更新

Google2FAで必要になるシークレットキーを保存するためのフィールドカラム)を追加します。
基本的には自由ですが、私は認証で使用するためusersテーブルに追加しています。
マイグレーションファイルを作って、

中はこんな感じです。

database/migrations/XXXX_XX_XX_XXXXXX_update_users_table.php

フィールド名は設定ファイルconfig/google2fa.phpのデフォルトに合わせて、google2fa_secretとしています。
できたら、

でusersテーブルに反映させましょう。また、同時にUserモデルも変更しておきましょう。
$fillableとパスワード同様に$hiddenにも加えておきます。

app/User.php

シークレットキーの暗号化

余談ですが、シークレットキー暗号化することもお勧めします。
以前の記事で紹介したトレイトを利用する方法でも構いません。

単純に暗号化するならこちらを参考にどうぞ。

シークレットキーの登録

ユーザー登録する際に、一緒にシークレットキーを生成して、先程作成したgoogle2fa_secretフィールドに追加します。

RegisterController.php

追加したのはこの一行だけです。

これでシークレットキーの登録は完了です。

ミドルウェアを追加

Google2FAパッケージには既にミドルウェアが用意されています。
それを反映させるためにKernel.phpに追加しましょう。

app/Kernel.php

通常、ミドルウェアでログイン状態をフィルターする場合は’auth‘だけですが、2段階認証をするには上記で追加した’2fa‘を加えます。

routes/web.php

更に、認証画面用のルートも用意されています。

ビューを追加

ビューを作成する前に、Google2FAで用意されているgetQRCodeGoogleUrl関数でQRコードURLを作成します。

$google2fa_url変数に代入したものを次のビューに渡してあげましょう。
ビューも設定ファイルに記載している通り、’google2fa.index‘に作成します。

resources/views/google2fa/index.blade.php

ここでのポイントは、QRコード画像URL

で取得し、シークレットキーをユーザー登録時に追加した

で取得します。
そして、ワンタイムキーを入力するフォームの名前を設定ファイルの通り

とします。

2段階認証 完成イメージ
2段階認証 完成イメージ

アプリを使ってみる

ここまで設定したら、Google Authenticatorをダウンロードしてみよう。
ダウンロードはこちら。

Google Authenticator
Google Authenticator



Google Authenticatorについて

Google AuthenticatorとはGoogleが開発した二段階認証(二要素認証)を行うトークンソフトウェアである。
AuthenticatorはユーザーがGoogleのサービスにログインする時に必要な通常のIDとパスワードと共に入力しなければいけない6桁の数字コードを提供する。
また、LastPassやDropboxといった他社製のアプリケーションでもコードを発行することが出来る。

引用:Google Authenticator – Wikipedia

今回はかなり長い記事になりました…。
書き洩れてるかもしれませんので、見つけたらご指摘ください。

著:山崎 大助
¥3,300 (2024/07/16 15:14時点 | Amazon調べ)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (1件)

  • […] WinAuthを導入する前に、対象のサービスのシークレットキー、もしくは読み取れる場合はQRコードを用意しておきましょう。 例えば、以前ご紹介したLaravelでGoogle Authenticatorを利用した2段階認証システムを構築したことがあります。 Laravel 5.5に2段階認証システムを導入する(Google2FA)https://minory.org/laravel-google2fa.html何かとセキュリティが問われる昨今、これまでのIDとパスワードだけの認証では不安を感じている方も多々いると思います。近年、もしかしたら皆さんもご存知か、既に使われているかもしれませんが、ワンタイムパスワードを利用した2段階認証というものがあり、今回はそ… Minory  1 share 1 user この場合だと、2段階認証を設定する場面で表示されるシークレットキーとQRコードです。 他のサービスも同じように表示されるはずです。 このシークレットキーは再発行が難しく、サービスによっては再発行してくれません。 さらに、Google Authenticatorは機種変する際のバックアップ、またはデータ移行ができないようですので、必ず控えておきましょう。 スマホで登録するとこのようになります。 おそらく、PCではURLスキームを使えないです。 URLスキームでスマホのWEBブラウザからアプリを起動するhttps://minory.org/url-scheme.htmlスマホ用のWEBアプリ作ることが増えた今日この頃。ネイティブアプリと連携したくなることもしばしばあります。以前から、メールアプリを開いて指定した宛先に送信させたい場合は「mailto:~」、電話アプリから指定した電話番号へ発信させたい場合は「tel:~」と言う… Minory  2 shares 2 users […]

コメントする

CAPTCHA


目次