a2workspace/laravel-jwt

一个几乎零配置的API认证服务

2.2.0 2024-05-03 14:16 UTC

This package is auto-updated.

Last update: 2024-10-03 15:15:34 UTC


README

一个几乎零配置,即开即用的API认证服务。


此包是基于 php-open-source-saver/jwt-auth 的封装,并提供了一个简单的 AuthenticatesUsers 特性方便扩展。

特性

  • 支持多用户模型
  • 兼容 Nuxt.jsauth-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 配置文件。将 apidriver 修改为 jwt

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

注册路由

最后,您应该在 App\Providers\AuthServiceProviderboot 中注册 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,您可以自行修改为 phoneemailaccount...等。

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 支持

此包与 Nuxtauth-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'
      },

    },
  }
}