一個幾乎零配置,隨開即用的 API 認證服務。
此套件是基於 php-open-source-saver/jwt-auth 的包裝,並提供一個簡易的 AuthenticatesUsers 特性方便擴充。
特性:
- 支援多使用者模型
- 相容 Nuxt.js 的
auth-nuxt。如何設定請參考 # Nuxt Supprt
執行下列命令透過 composer 引入到你的 Laravel 專案:
composer require a2workspace/laravel-jwt接著,執行 laravel-jwt:install Artisan 指令來進行安裝。
該指令會生成設定檔,並注入 JWT_SECRET 到 .env 中。
php artisan laravel-jwt:install現在應該會有個 config/jwt.php 檔案。
要讓你的 API 可以透過 jwt 登入需要做以下的設定:
首先讓你的 User 模型實作 A2Workspace\LaravelJwt\Contracts\JWTSubject 介面;
並將 A2Workspace\LaravelJwt\HasApiTokens 特性加到你的 User 模型中;
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use A2Workspace\LaravelJwt\HasApiTokens;
use A2Workspace\LaravelJwt\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
use HasApiTokens, HasFactory, Notifiable;
}Interface A2Workspace\LaravelJwt\Contracts\JWTSubject 繼承自 PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject 設定可參考 Update your User model - Laravel JWT Auth
接著,找到你專案的 config/auth.php 設定檔。將 api 的 driver 修改為 jwt。
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],最後,你應該在 App\Providers\AuthServiceProvider 的 boot 中註冊 LaravelJwt::routes:
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use A2Workspace\LaravelJwt\LaravelJwt;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
if (! $this->app->routesAreCached()) {
LaravelJwt::routes();
}
}
}你可以透過覆寫 /api/auth/user 路徑來修改回傳的使用者資訊:
// routes/api.php
Route::middleware('auth:api')->get('/auth/user', function (Request $request) {
return new UserResource($request->user());
});這裡告訴你如何編寫自己的認證控制器,你可以參考 A2Workspace/laravel-social-entry-demo 中如何配置多使用者模型認證。
一個簡易範例:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Resources\AdminResource;
use A2Workspace\LaravelJwt\AuthenticatesUsers;
class AuthController extends Controller
{
use AuthenticatesUsers;
/**
* 回傳認證守衛
*
* @return \PHPOpenSourceSaver\JWTAuth\JWTGuard
*/
protected function guard(): JWTGuard
{
return Auth::guard('admin');
}
/**
* 取得驗證使用者名稱的欄位
*
* @return string
*/
protected function username()
{
return 'account';
}
/**
* {@inheritDoc}
*/
public function me(Request $request)
{
return new AdminResource($request->user());
}
}A2Workspace\LaravelJwt\AuthenticatesUsers 提供了 JWT 登入認證所需的所有方法,僅需要在控制器中使用該特性,並註冊到專案的路由檔案。
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use A2Workspace\LaravelJwt\AuthenticatesUsers;
class AuthController extends Controller
{
use AuthenticatesUsers;
}需對應 configs/auth.php 中的 guards 名稱,且 driver 必須為 jwt。
use PHPOpenSourceSaver\JWTAuth\JWTGuard;
class AuthController extends Controller
{
use AuthenticatesUsers;
/**
* 回傳認證守衛
*
* @return \PHPOpenSourceSaver\JWTAuth\JWTGuard
*/
protected function guard(): JWTGuard
{
return Auth::guard('custom-api-guard');
}
}預設為 username,你可以自行修改為 phone、email、account...等。
class AuthController extends Controller
{
use AuthenticatesUsers;
/**
* 取得驗證使用者名稱的欄位
*
* @return string
*/
protected function username()
{
return 'username';
}
}// routes/api.php
Route::post('/auth/login', 'AuthController@login');
Route::post('/auth/logout', 'AuthController@logout');
Route::post('/auth/refresh', 'AuthController@refresh');
Route::get('/auth/user', 'AuthController@me');注意: 當使用自訂控制器時,就不需要在 App\Providers\AuthServiceProvider 中重複註冊 LaravelJwt:routes 了。
此套件相容於 Nuxt 的 auth-nuxt 模組中的 Laravel JWT (參考這裡)。
// nuxt.config.js
auth: {
strategies: {
'laravelJWT': {
provider: 'laravel/jwt',
url: '<laravel url>',
endpoints: {
// ...預設這裡不需要修改
},
token: {
property: 'access_token',
maxAge: 60 * 60
},
refreshToken: {
maxAge: 20160 * 60
},
},
}
}當使用 UserResource 時,由於使用者資料是放在 data 欄位而不是最頂層,需增加 user.property 的設定:
// nuxt.config.js
auth: {
strategies: {
'laravelJWT': {
provider: 'laravel/jwt',
// ...
user: {
property: 'data'
},
},
}
}