はじめに
laravelを学習し始めたのでlaravel passportを利用してユーザー情報の取得を行った
ログイン機能の作成部分まではlaravelのドキュメントを流用しているのでそちらをみるとより正確な情報を得ることができるので、ぜひそちらを見てください
環境
- laravel 6.5.1
- mysql 5.7
手順
laravel passportのパッケージをインストール
$ composer require laravel/passport
クライアントとアクセストークンを保存しておくためのテーブルを作成
$ php artisan migrate
App\User
モデルにLaravel\Passport\HasApiTokens
トレイトを追加する
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens; // 追加
class User extends Authenticatable
{
use HasApiTokens, Notifiable; // HasApiTokensを追加
}
AuthServiceProvider.php
内でアクセストークンの発行、失効のためにPassport::routes
メソッドを呼び出す
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport; // 追加
class AuthServiceProvider extends ServiceProvider
{
/**
* アプリケーションのポリシーのマップ
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy', // 最初はコメントされているのでコメントを削除する
];
/**
* 全認証/認可サービスの登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes(); // 追加
}
}
config/auth.php
内のガードのapi
認証のdriver
オプションをtoken
からpassport
に変更する
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport', // token => passport
'provider' => 'users',
],
],
アクセストークンを生成するために必要な暗号キーの作成
$ php artisan passport:install
コントローラーの作成
$ php artisan make:controller Api/AuthController
Api/AuthControllerにloginメソッドを作成
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\JsonResponse;
class AuthController extends Controller
{
public function login(Request $request): JsonResponse
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('Laravel Password Grant Client')->accessToken;
return new JsonResponse(['token' => $token], 200);
}
return new JsonResponse([
'message' => 'Unauthenticated.'
], 401);
}
}
routes/api.phpにログイン用のルートを追加
Route::post('/login', 'Api\AuthController@login');
ユーザーの作成
$ php artisan tinker
$ $user = new App\User;
$ $user->name = 'testuser';
$ $user->email = 'test@email.com';
$ $user->password = Hash::make('testtest');
$ $user->save();
Tokenをリクエストする
$ curl -X POST http://localhost:8000/api/login -d email=test@email.com -d password=testtest
レスポンス
{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI2IiwianRpIjoiZmU1YWE4OGY1MTRkYzdmZDUyOTlkYzMyZDE3NmIwNGM0YWE0MDRhNWZkMzBkYmFmYjJhYzExMDhiYWNkNDJiOTc0ZDY4OTQ1MWU5MTcwYWMiLCJpYXQiOjE1NzQwOTI4MjMsIm5iZiI6MTU3NDA5MjgyMywiZXhwIjoxNjA1NzE1MjIzLCJzdWIiOiIxIiwic2NvcGVzIjpbXX0.B6FoP_dLWwCN9S17WxMUplPKVZyLwaW7zIRzVJJm-sFlCQ65JOxtGYgsVWeAHmadnmwOJ3yL3Yz1mHHpBFk9ZFD3mGy23UQIqGM71JUyrvjrAlDLmiyqNGz1PUM-7_ta3FM4-KDn7OWCiUnYHZMWJtylP9wvQ8b3ArglC4DeaQxgGvCQS7_vavB1_o0I7kEkqRjHuXl0-7I_w9E2FQXJHrw7tFPdznAy6rkeOYMLKdDEvAOdSlNXCwwhiARPFWiTk7NaBAlfa0Wjf8MeJSFIlUf9AiJo7lLu8r28A4Miik7J_Y9dRxipUcdCjiz7gPjPqFXeeqhH1NQk_qC-6Fy2u2xzx6pAU-Lu1vp32TANn9ZQ5Vn0xFxJJBTJ0FoOzqcQ44fb5T93K9sCIc_1L_X75K3g5KsY96N4h_bZr84e_VUvB_WHQ0iq8VJO2F-Lj1tsSJiUOUwepB1d2eIWbFzWTc1Ur56crUoBr27GoilhFT-8qp5Md2qoOeottu5qO1v5ybOj9DGZIKeZVN_z4L4awb-IuseMGQQCbfquMNmBaLAmgFTlhA3usoiArp9sX4WC1uphf9u9bhAr5tCiqdeVI5K-lLo_qESfP_Zney2IZtmLNCrNpjwxk7BJA7Sl4oI0clUYg-NJnrhRIRW7DHg1Z7eHZsaItDORCkr78HMlHr4"}
Tokenからユーザー情報を取得
$ curl -X GET http://localhost:8000/api/user -H 'Content-Type: application/json' -H 'Authorization: Bearer 取得したToken'
レスポンス
{"id":1,"name":"test","email":"test@email.com","email_verified_at":null,"created_at":"2019-11-18 10:56:18","updated_at":"2019-11-18 10:56:18"}
以上でユーザー情報の取得をできるようになりました。