PHPでGoogle Authenticator対応の2段階認証(TOTP)を作る方法【RobThree】

開発

はじめに

最近ではセキュリティ向上の為アカウントシステムを運用しているようなサービスでは2段階認証が当たり前の時代になってきました。自社のサービスにも組み込む必要がでてきたのでTOTP(時間ベースのワンタイムパスワード)システムをサクッと作成したいと思い作成してみました。

今回はphpプログラムでTOTPシステムを作っていこうと思います。使用するライブラリはphpのRobThreeを使います。

RobThree はPHPの二段階認証(2FA)ライブラリです。正式名称は TwoFactorAuth です。Google AuthenticatorやAuthyなどの認証アプリと連携するTOTPを実装するためのライブラリです。

インストール

とりあえずインストールしてみます。使用するサーバはAlmaLinux release 10.0 (Purple Lion)を使用します。phpのバージョンはPHP 8.4.14を使用しています。

composer require robthree/twofactorauth

これでインストールは完了です。以下で基本的な使い方を説明します。

基本的な使い方

1.シークレットキーの生成(ユーザー登録時)

php

require 'vendor/autoload.php';
use RobThree\Auth\TwoFactorAuth;

$tfa = new TwoFactorAuth('アプリ名');

// シークレットキーを生成してDBに保存
$secret = $tfa->createSecret();

シークレットキーの生成は非常にシンプルです。この作成したシークレットキーをDBに保存したり、一時的にセッション等に保存したりして使用できます。状況によって保存場所等は変化させてください。DBに保存する際はAES-GCM等で暗号化してDBに保存する方がセキュリティ上はより安全です。

2.QRコードの表示(ユーザーに認証アプリで読み取らせる)

php

$qrCodeUrl = $tfa->getQRCodeImageAsDataUri('ユーザー名', $secret);
echo '';

3.ワンタイムパスワードの検証(ログイン時)

php

$code = $_POST['code'];  // ユーザーが入力した6桁コード

if ($tfa->verifyCode($secret, $code)) {
    echo '認証成功';
} else {
    echo '認証失敗';
}

認証時にはverifyCode($secret, $code)を使用します。成功時の処理としては例えばセッション内にフラグを残して何か判定するのであればフラグの処理を入れたりします。

主なメソッド

メソッド 説明
createSecret() シークレットキー生成
getQRCodeImageAsDataUri() QRコード画像生成
verifyCode($secret, $code) ワンタイムパスワード検証
getCode($secret) 現在の6桁コード取得(テスト用)

特徴

  • Google Authenticator / Authy / Microsoft Authenticator と互換性あり
  • RFC 6238(TOTP)準拠
  • Composerで簡単導入

ログインに6桁の認証コードを追加したい場合に広く使われているライブラリです。以上がRobThree の簡単な使い方です。

まとめ

いかがでしたでしょうか。これからTOTP認証機能を追加したいと考えているのであれば非常に簡単に作成できるツールなのではないかなと思います。
認証アプリもGoogleAuthenticatorやマイクロソフトの認証アプリなんかでも使用できますのでぜひ実装してみてください。
次回はもう少し実践的な話ができればと思います。