[Laravel] tymon/jwt-authを使ってAPIサーバをjwt認証する

カテゴリ: jwt, Laravel

関連ドキュメント

特記事項

Qiita記載の手順で動作確認するために下記の作業を行った

テストユーザの作成が必要

$ php artisan tinker

$user = new User;
$user->name = "test user";
$user->email = "test@example.jp";
$user->password = Hash::make('password');
$user->save();

User::where('email', 'test@example.jp')->first();

artisan serverで起動した時は、ポート番号を指定する

# OKパターン
curl -X POST -H "Accept: application/json" -F "email=test@example.jp" -F "password=password" http://localhost:8000/api/auth/login

# 認証NG
curl -X POST -H "Accept: application/json" -F "email=test@example.jp" -F "password=password_invalid" http://localhost:8000/api/auth/login
# 認証ありでのアクセス
JWT_TOKEN=eyJ....(auth/loginの結果をセット)
curl -X POST -H "Accept: application/json" -H "Authorization: Bearer ${JWT_TOKEN}" http://localhost:8000/api/auth/me

# リフレッシュトークンの取得
curl -X POST -H "Accept: application/json" -H "Authorization: Bearer ${JWT_TOKEN}" http://localhost:8000/api/auth/refresh

トークンには"."が含まれていて、トークン全体をbase64でデコードできない("."で区切った各パーツ単位でデコードする必要がある)。

これが煩雑な場合は、trコマンドで"."を取り除いてしまうと手っ取り早空くチェックできる。

# 受け取ったトークンのデコード
echo $JWT_TOKEN | tr  '.' ' ' | base64 --decode

PHPUnitのテストコード

上記確認を自動化するためにPHPUnitのテストコードを追加しておく

  • ユニットテストのファイルを作成
./artisan make:test ApiAuthTest
  • テスト内容 (tests/Feature/ApiAuthTest.php)
<?php

namespace Tests\Feature;

use App\User;
use Tests\TestCase;

class ApiAuthTest extends TestCase
{
    /**
     * @return void
     */
    public function testOk()
    {
        $password = 'password';
        $passwordInvalid = 'invalid';

        // ユーザを作成
        $user = new User();
        $user->name = "userName";
        $user->email = "test_".md5(mt_rand())."@example.jp";
        $user->password = \Hash::make($password);
        $user->save();


        // ログインできる事
        $data = [
            'email' => $user->email,
            'password' => $password,
        ];
        $res = $this->postJson('/api/auth/login', $data);
        $res->assertJsonStructure(['access_token', 'token_type', 'expires_in']);

        $json = $res->json();
        $this->assertEquals($json['token_type'], 'bearer');
        $this->assertEquals($json['expires_in'], 3600);
        $jwtToken = $json['access_token'];



        // 不正なパスワードでログインできない事
        $data = [
            'email' => $user->email,
            'password' => $passwordInvalid,
        ];
        $res = $this->postJson('/api/auth/login', $data);
        $res->assertJsonStructure(['error']);

        $json = $res->json();
        $this->assertEquals($json['error'], 'Unauthorized');



        // ユーザ情報が取得できる事
        $headers = [
            'Authorization' => "Bearer {$jwtToken}",
        ];
        $res = $this->postJson('/api/auth/me', [], $headers);
        $res->assertJsonStructure(['id', 'name', 'email']);

        $json = $res->json();
        $this->assertEquals($json['id'], $user->id);
        $this->assertEquals($json['name'], $user->name);
        $this->assertEquals($json['email'], $user->email);



        // リフレッシュトークンが取得できる事
        $headers = [
            'Authorization' => "Bearer {$jwtToken}",
        ];
        $res = $this->postJson('/api/auth/refresh', [], $headers);
        $res->assertJsonStructure(['access_token', 'token_type', 'expires_in']);

        $json = $res->json();
        $this->assertEquals($json['token_type'], 'bearer');
        $this->assertEquals($json['expires_in'], 3600);
    }
}
  • PHPUnitを実行し成功することを確認
$ vendor/bin/phpunit --filter=ApiAuthTest
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.

.                                        1 / 1 (100%)

Time: 145 ms, Memory: 18.00 MB

OK (1 test, 18 assertions)
Amazonでポイントを賢くGETする方法
Amazonギフト券チャージ で最大2.5%もお得!
こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。