人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

LaravelでFirebaseのjwt(accessToken)を認証する

PHP用のいろいろなパッケージがありますが、firebase / php-jwt を使用してみます

● firebase / php-jwt

https://github.com/firebase/php-jwt

インストール

composer require firebase/php-jwt
composer require guzzlehttp/guzzle

 

tests/Unit/VerifyFirebaseTokenTest.php

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Firebase\JWT\JWT as FirebaseJWT;
use Firebase\JWT\Key;
use Illuminate\Support\Facades\Http;

class VerifyFirebaseTokenTest extends TestCase
{
    public function test_verify_firebase_auth_jwt()
    {
        $verify_result = $this->verifyJWT("<検証したいjwtをここに貼り付ける>");
        $this->assertTrue($verify_result);
    }

    /**
     * Firebase Auth の jwtを検証する(公開鍵はgoogleサーバから取得する)
     * @param   string    $accessToken 
     * @returns boolean
     */
    public function verifyJWT($accessToken)
    {
        $kid = $this->getKidFromJwtHeader($accessToken);
        $publicKey = $this->getPublicKeyFromFirebase('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com', $kid);
        $key = new Key($publicKey, 'RS256');

        $decoded = null;
        try {
            $decoded = FirebaseJWT::decode($accessToken, $key);
            return ($decoded) ? true : false;
        } catch (\Throwable $th) {
            // throw new Error('error 発生');
            return false;
        }
    }


    /**
     * jwtからヘッダの中のkidを取得
     * @param   string    $token 
     * @returns string
     */
    public function getKidFromJwtHeader($token)
    {
        $jwtHeader = $this->getJwtHeader($token);
        $obj = json_decode($jwtHeader, true);
        return $obj['kid'];
    }

    /**
     * jwtからヘッダを取得
     * @param   string $token 
     * @returns string
     */
    public function getJwtHeader($token)
    {
        $tokenHeader = preg_split('/\./', $token)[0];
        $jwtHeader = base64_decode($tokenHeader);
        return $jwtHeader;
    }

    /**
     * Firebaseのjwt検証用公開鍵を取得する
     * @param   string      $url 
     * @param   string      $kid 
     * @returns string
     */
    public function getPublicKeyFromFirebase($url, $kid)
    {
        $response = Http::get($url);
        $body = $response->body();
        $publicKeys = json_decode($body, true);
        $key = $publicKeys[$kid];
        return $key;
    }
}

● テストの実行

php artisan test tests/Unit/VerifyFirebaseTokenTest.php
No.2223
10/07 15:17

edit