この記事は、既にLaravel10のプロジェクトが作成してあることを前提としています。
1. JWT認証のパッケージをインストール
任意のプロジェクトへ移動し、下記コマンドを入力してJWT認証のパッケージをインストールしてください。
composer require php-open-source-saver/jwt-auth
設定ファイル(config/jwt.php
)を生成します。
php artisan vendor:publish --provider="PHPOpenSourceSaver\JWTAuth\Providers\LaravelServiceProvider"
.env
上にJWTの秘密鍵を生成します。
php artisan jwt:secret
2. Guardの変更
config/auth.php
を下記のように書き換えてください。
config/auth.php
// デフォルトのコメントは省略しています
return [
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_reset_tokens',
'expire' => 60,
'throttle' => 60,
],
],
'password_timeout' => 10800,
];
3. Userモデルに追記
下記を参考にUserモデルに追記してください。
Models/User.php
// 省略
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
use Laravel\Sanctum\HasApiTokens;
// JWTSubjectインターフェースの実装を忘れずに
class User extends Authenticatable implements JWTSubject
{
use HasApiTokens, HasFactory, Notifiable;
// 省略
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
}
4. コントローラーの作成
php artisan make:controller AuthController
Http/Controllers/AuthController.php
// 省略
use Illuminate\Support\Facades\Auth;
use App\Models\User;
class AuthController extends Controller
{
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login', 'register']]);
}
public function login(Request $request)
{
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
]);
$credentials = $request->only('email', 'password');
$token = Auth::attempt($credentials);
if (!$token) {
return response()->json([
'message' => '認証に失敗しました。',
], 401);
}
$user = Auth::user();
return response()->json([
'user' => $user,
'authorization' => [
'token' => $token,
'type' => 'bearer',
]
]);
}
public function register(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
]);
return response()->json([
'message' => 'ユーザーの作成に成功しました!',
'user' => $user
]);
}
public function logout()
{
Auth::logout();
return response()->json([
'message' => 'ログアウトしました。',
]);
}
public function refresh()
{
return response()->json([
'user' => Auth::user(),
'authorization' => [
'token' => Auth::refresh(),
'type' => 'bearer',
]
]);
}
}
5. ルートの作成
routes/api.php
use App\Http\Controllers\AuthController;
Route::controller(AuthController::class)->group(function () {
Route::post('login', 'login');
Route::post('register', 'register');
Route::post('logout', 'logout');
Route::post('refresh', 'refresh');
});
6. Postmanで確認
ここまでできればJWT認証が実装できているはずです。APIを実行して見ましょう。ツールは何でも良いですが、ここではPostmanを使います。
- ユーザー登録
http://127.0.0.1:8000/api/register
- ログイン
http://127.0.0.1:8000/api/login
- トークン更新
※ヘッダーにBearerトークンを記載するのを忘れずに
http://127.0.0.1:8000/api/refresh
- ログアウト
※ヘッダーに更新後のBearerトークンを記載するのを忘れずに
http://127.0.0.1:8000/api/logout
参考