LoginSignup
2
3

LaravelでGoogle Two-Factor Authentication(2FA)を導入する方法

Posted at

Google Two-Factor Authentication(2FA)の導入方法

Google Two-Factor Authentication(2FA)の導入をしたのでその備忘録

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

まずは、Google2FAパッケージをインストール

composer require pragmarx/google2fa-laravel

こちらのライブラリ
https://github.com/antonioribeiro/google2fa-laravel

設定

Google2FAパッケージをインストールしたら、Laravelの設定ファイルを公開する

php artisan vendor:publish --provider="PragmaRX\Google2FALaravel\ServiceProvider"

middlewareの設定

app/Http/Kernel.php
上記のKernel.phpファイルに下記を追加

protected $routeMiddleware = [
    // 略
    '2fa' => \PragmaRX\Google2FALaravel\Middleware::class,
];

ルートの設定

2FAの認証ルートを設定します。

Route::group(['middleware' => 'auth','2fa'], function () {
    Route::get('two-factor-authentication', [Google2faController::class, 'index']);
    Route::post('two-factor-authentication/login', [Google2faController::class, 'login']);
});

認証処理

コードに詳細を記載しておきます。

<?php

namespace App\Http\Controllers\Api\Admin;

// use略
use PragmaRX\Google2FA\Google2FA;

class Google2faController extends Controller
{
    // 表示
    public function index()
    {
        $google2fa = new Google2FA(); // 必須

        $secretKey = $google2fa->generateSecretKey(); //必須

        $user->google2fa_secret_key = $secretKey;
        $user->save();
        // ↑ここで、あらかじめ作成したUserテーブルのシークレットキー用カラムに$secretKeyを保存しておく

        $google2faUrl = $google2fa->getQRCodeUrl(
            $Name, // ログインする名前を入れるのが一般的
            $user->email, // ユーザーのメールアドレス
            $secretKey
        );
        
        $google2faItems = [ 
            'secretKey' => $secretKey,
            'QRCodeUrl' => $google2faUrl // これをフロント側でどうにかしてQRコードに変換
        ];
        }


        return $google2faItems;
    }


    //ログイン処理
    
    public function login(Request $request)
    {
        $code      = $request->input('authenticationCode');
        // $request->input('authenticationCode');はGoogle Authenticaterアプリで表示されている6桁の数字
        $secret    = $request->input('secretKey');
        // シークレットキー
        $google2fa = new Google2FA(); // 必須

        $valid = $google2fa->verifyKey($secret, $code);
        // $validで認証の結果がbooleanで返ってくる
        
        if (!$valid) {
            return response()->json(
                ['message' => 'アクセス権限がありません']
            );
        }

        return $loginData //ログイン後に必要なデータを返す。
    }
}

ここから、開発環境によって変更する部分がありますが、私はこれでgoogleの2段階認証の実装を行いました!

ご参考になれば幸いです。

一緒に働く仲間を募集しています!

株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています!

事業拡大に伴い、エンジニアさんを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/projects/1522201

2
3
0

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
  3. You can use dark theme
What you can do with signing up
2
3