一般的にWebには認証機能があるケースが多いと思います。今回はLaravelで認証APIを作る方法として、JWTを使った方法を紹介します。
以下のバージョンを対象としています。
JWTとは、JSON Web Token の略で認証情報のやり取りに用いられます。JWTの仕組みについてはこちらを御覧ください。
以下のコマンドでLaravelの認証機能を有効化させます。
$ php artisan make:auth $ php artisan migrate
マイグレーションは実行しておきましょう。
$ php artisan migrate
JWTのライブラリとして jwt-auth を使用します。以下の通りインストールします。
$ composer require tymon/jwt-auth
以下のコマンドを実行してコンフィグファイルを作成します。実行すると config/jwt.php が生成されます。
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
以下のコマンドを実行して secret を作成します。実行すると、.env に JWT_SECRET が設定されます。
php artisan jwt:secret
今回は既存のユーザーモデルを認証に使います。ユーザーモデルに2つのメソッドを追加します。
<?php namespace App; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; // implements JWTSubject を追加 class User extends Authenticatable implements JWTSubject { use Notifiable; protected $fillable = [ 'name', 'email', 'password', ]; protected $hidden = [ 'password', 'remember_token', ]; // 追加 public function getJWTIdentifier() { return $this->getKey(); } // 追加 public function getJWTCustomClaims() { return []; } }
config/auth.php を修正します。
'defaults' => [ 'guard' => 'api', // 変更 'passwords' => 'users', ], // 省略 'guards' => [ 'api' => [ 'driver' => 'jwt', // 変更 'provider' => 'users', ], ],
コントローラーを作成して認証機能を実装します。以下のコマンドで AuthController.php を作成します。
php artisan make:controller AuthController
作成したコントローラーに認証機能を実装します。ログイン中のユーザーのデータは auth()->user() で取得できます。
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; class AuthController extends Controller { public function login() { $credentials = request(['email', 'password']); if (! $token = auth()->attempt($credentials)) { return response()->json(['error' => 'Unauthorized'], 401); } return $this->respondWithToken($token); } // 自身のユーザデータを取得 public function me() { return response()->json(auth()->user()); } public function logout() { auth()->logout(); return response()->json(['status' => 'ok']); } public function refresh() { return $this->respondWithToken(auth()->refresh()); } protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth()->factory()->getTTL() * 60 ]); } }
routes/api.php に作成したメソッドを紐づけます。
<?php use Illuminate\Http\Request; Route::group(['middleware' => 'guest:api'], function () { Route::post('/login', 'AuthController@login'); }); Route::group(['middleware' => 'auth:api'], function () { Route::get('/me', 'AuthController@me'); Route::post('/logout', 'AuthController@logout'); Route::post('/refresh', 'AuthController@refresh'); });
curlで疎通確認をしてみましょう。ユーザーデータは予め作成しておいてください。
以下のようにリクエストを投げると、
$ curl http://localhost/api/login -d email=hoge@example.com -d password=123456
以下のようなレスポンスが返却されます。
{ "access_token": "eyJhbGciOiJiUzL1NiIsInR5cCI6IkpcVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwsiwib3FtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab10RMHtHDcEfsjoYZgeFONFh7HgQ", "token_type": "bearer", "expires_in": 3600 }
また、認証が必要なAPIをコールする場合は、以下のように Authorization ヘッダーに Bearer: {token} を付加してリクエストを投げます。
$ curl -H "Authorization: Bearer eyJhbGciOiJ...." http://localhost/api/me
jwt-auth を使ってLaravelでログインAPIを実装する方法を紹介しました。