a2workspace / laravel-jwt
一个几乎零配置的API认证服务
Requires
- php: ^7.4|^8.0
- php-open-source-saver/jwt-auth: ^2.2
Requires (Dev)
- orchestra/testbench: 6.x
This package is auto-updated.
Last update: 2024-10-03 15:15:34 UTC
README
一个几乎零配置,即开即用的API认证服务。
此包是基于 php-open-source-saver/jwt-auth 的封装,并提供了一个简单的 AuthenticatesUsers 特性方便扩展。
特性
- 支持多用户模型
- 兼容 Nuxt.js 的
auth-nuxt
。如何设置请参考 # Nuxt 支持
安装
执行以下命令通过 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; }
A2Workspace\LaravelJwt\Contracts\JWTSubject
接口继承自 PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject
,设置可参考 更新您的用户模型 - Laravel JWT Auth
设置登录认证守卫 (Auth Guard)
接下来,找到您项目的 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 支持
此包与 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' }, }, } }