Laravelでのjwt-auth利用する為のメモ。
Laravelでのjwt-auth利用する為の自分用のメモです。
Laravelの認証機能を利用してテーブルを作成
$ php artisan make:auth
$ php artisan migrate
jwt-authをインストール
composer require tymon/jwt-auth
configファイル生成
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
config/jwt.php
が作成される。
secretの生成
php artisan jwt:secret
.env
ファイルにJWT_SECRET
が追加されているのを確認する。
app/User.php
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\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
<?php
return [
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
];
app/Http/Controllers/Api/AuthController.php
<?php
namespace App\Http\Controllers;
class AuthController extends Controller
{
function login() {
$credentials = request(['email', 'password']);
if (!$token = auth('api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
}
public function logout()
{
auth()->logout();
return response()->json(['message' => 'ログアウトしました。']);
}
public function me()
{
return response()->json(auth()->user());
}
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth("api")->factory()->getTTL()
]);
}
}
トークンの有効期限は60分に設定されている。 変更するにはconfig/jwt.php
を変更する。
routes/api.php
<?php
use Illuminate\Http\Request;
Route::post('/login', 'Api\AuthController@login');
// ユーザー情報と、ログアウトは認証あり
Route::group(['middleware' => 'auth:api'], function () {
Route::get('/me', 'Api\AuthController@me');
Route::post('/logout', 'Api\AuthController@logout');
});
疎通を確認
ユーザーデータを作成
以下を実行。
php artisan make:seeder UsersTableSeeder
以下を設定。
<?php
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/####
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
[
'email' => 'admin@example.com',
'password' => bcrypt('password'),
'remember_token' => null,
'created_at' => '2018-10-02 14:28:19',
'updated_at' => '2018-10-02 14:28:19'
]
]);
}
}
実行。
php artisan db:seed
テーブルにユーザー情報が追加されているのを確認する。
ログインしてみる
curl http://localhost:8080/api/login -d email=admin@example.com -d password=password
以下が返却されればOK。
{"access_token":"eyJ0e...","token_type":"bearer","expires_in":3600}
アクセストークンを利用してユーザー情報を取得してみる
curl -H "Authorization: Bearer eyJ0e..." http://localhost:8080/api/me
以下が返却されればOK。
{"id":1,"email":"admin@example.com","email_verified_at":null,"created_at":"2018-10-02 14:28:19","updated_at":"2018-10-02 14:28:19"}
ユーザー登録をしてみる
app/Http/Controllers/Api/AuthController.php
以下を追加。
public function register(Request $request)
{
$user = new User;
$user->fill($request->all());
$user->password = bcrypt($request->password);
$user->save();
return $this->publishToken($request);
}
protected function publishToken($request)
{
$credentials = request(['email', 'password']);
$token = auth('api')->attempt($credentials);
return $this->respondWithToken($token);
}
routes/api.php
に以下を追加
Route::post('/login', 'Api\AuthController@login');
+ Route::post('/register', 'Api\AuthController@register');
実行
curl http://localhost:8080/api/register -d email=sample@example.com -d password=password
以下が返却されればOK。
{"access_token":"eyJ0eXAi...","token_type":"bearer","expires_in":3600}