人気のPHP WEBアプリケーションフレームワークLaravelのTips。 (Laravelアプリの初期化)composer create-project laravel/laravel my-app

LaravelでFirebaseのjwt(accessToken)を認証する。認証ミドルウェアを作成する(kreait / laravel-firebase)

● kreait / laravel-firebaseを使ってLaravelでFirebaseのjwt(accessToken)を認証する

1. kreait / laravel-firebase のインストール

composer require kreait/firebase-php
composer require kreait/laravel-firebase

2. ファイル config/firebase.php の自動生成

php artisan vendor:publish --provider="Kreait\Laravel\Firebase\ServiceProvider" --tag=config
vi tests/Unit/LaravelFirebaseTest.php

3. config/app.phpの「Class Aliases」の配列に以下を追加

'ServiceProvider' => Kreait\Laravel\Firebase\ServiceProvider::class,

4. .envへ以下の設定項目を追加。

# Firebase設定
FIREBASE_CREDENTIALS=firebase.json

5. Firebase コンソールへログインし、「プロジェクトの設定」→「新しい秘密鍵を生成」から jsonファイルをダウンロードする。

ダウンロードしたファイルを firebase.json としてプロジェクトトップへアップロードします。

6. ユニットテストファイルを作成する

vi tests/Unit/LaravelFirebaseTest.php
<?php

namespace Tests\Unit;

use Tests\TestCase;
use Kreait\Firebase\Exception\Auth\RevokedIdToken;
use InvalidArgumentException;

class LaravelFirebaseTest extends TestCase
{
    /**
     * @testdox JWTトークン取得
     */
    public function test_verify_firebase_auth_jwt()
    {
        // テストしたいトークン
        $token = "ey....................................";

        // @see vendor/kreait/laravel-firebase/src/ServiceProvider.php
        $auth = app('firebase.auth');
        try {
            // @see https://github.com/kreait/firebase-php/blob/7.x/src/Firebase/Contract/Auth.php
            $parsedToken = $auth->verifyIdToken($token, $checkIfRevoked = true);
        } catch (InvalidArgumentException $e) {
            return $e->getMessage();
        } catch (RevokedIdToken $e) {
            return $e->getMessage();
        }

        dump($parsedToken->claims());

        $this->assertSame($parsedToken->claims()->get('name'), "<Firebaseに登録しているユーザー名>");
    }
}

7. ユニットテストの実行

php artisan test --testdox tests/Unit/LaravelFirebaseTest.php

・Auth.php のメソッドはこちらを参照

https://github.com/kreait/firebase-php/blob/7.x/src/Firebase/Contract/Auth.php

● Laravel用のFirebase認証ミドルウェアを作成する

1. ミドルウェア firebase を 作成する

vi app/Http/Middleware/Firebase.php

app/Http/Middleware/Firebase.php

<?php

namespace App\Http\Middleware;

use Kreait\Firebase\Contract\Auth;
use Kreait\Firebase\Exception\Auth\FailedToVerifyToken;

class Firebase
{
  private Auth $auth;
  public function __construct(Auth $auth)
  {
    $this->auth = $auth;
  }

  public function handle($request, \Closure $next)
  {
    $idTokenString = $request->headers->get('authorization');
    $token = trim(str_replace('Bearer', '', $idTokenString));

    try {
      $verifiedIdToken = $this->auth->verifyIdToken($token);
    } catch (FailedToVerifyToken $e) {
      echo 'The token is invalid: ' . $e->getMessage();
    }

    $user_id = $verifiedIdToken->claims()->get('user_id');
    $email = $verifiedIdToken->claims()->get('email');

    $request->attributes->set('firebase_data', [
      'user_id' => $user_id,
      'email' => $email,
    ]);

    return $next($request);
  }
}

2. 作成したミドルウェアを Kernel に登録

vi app/Http/Kernel.php

app/Http/Kernel.php

    protected $middlewareAliases = [
        ........
        // 次の行を追加
        'firebase' => \App\Http\Middleware\Firebase::class,
    ];

3. /api/ping エンドポイントを追加(認証なし)

vi routes/api.php
Route::get('/ping', function () {
    return 'ping ok!!!';
});

まずはトークンなしでアクセスします(ブラウザからでok) http://YOUR-SERVER/api/ping

4. /api/ping エンドポイントを追加(認証あり)

vi routes/api.php

先程のルートにミドルウェアを追加します

Route::group(['middleware' => 'firebase'], function () {
    Route::get('/ping', function () {
        return 'ping ok!!!';
    });
});

PostmanやVS Code Thunder Client などでアクセスします。

添付ファイル1
No.2400
09/25 12:27

edit

添付ファイル