関連ドキュメント
特記事項
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)
こちらもおススメ