我如何使用 Laravel Sanctum 处理 SPA 和基于令牌的身份验证

adr*_*ien 5 authentication laravel laravel-sanctum

我花了几天时间在 Laravel Sanctum 上尝试弄清楚如何设置我的身份验证系统。

语境

我正在为我的公司构建一个门票 Web 应用程序,为此我决定构建一个 API 和一个使用该 API 的 React 前端应用程序。该应用程序的最终用户需要一个帐户来管理票证,因此我在数据库中创建一个用户表,并为 API 创建多个路由来创建、删除和更新用户。为了管理用户 api 身份验证,我决定使用 Laravel Sanctum 及其基于会话的内置 SPA 身份验证系统。

为此,我遵循指南并设置所有需求,以确保前端准备好与 Laravel Santum 一起使用。这是我的 api 中间件的 Kernel.php :

'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
],
Run Code Online (Sandbox Code Playgroud)

web.php 中的路由通过 Laravel Sanctum SPA 身份验证登录/注销用户。

<?php
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::post('/login', [UserController::class, 'login']);
Route::get('/logout', [UserController::class, 'logout']);
Run Code Online (Sandbox Code Playgroud)

问题

我必须构建一个非 Web 应用程序,特别是一个 Windows 服务,它需要在数据库中获取数据,并使用/api/ticketsAPI 的端点和POST方法来使用这些数据创建新票证。

我知道这个未来的 Windows 服务不是前端应用程序,所以我无法使用 SPA 身份验证系统。相反,我想使用 Laravel Sanctum 的令牌来验证服务。

我的问题是:

  • 我如何实现这一点并将users身份验证和service身份验证分开。
  • 由于我的 api 包含用于最终用户身份验证的http://myapi.net/loginet ,我是否需要创建类似用于发送和删除令牌的路由之类的内容?http://myapi.net/logoutapi/auth/service
  • 我应该在数据库中创建一个名为的新表service还是保留user表?

jss*_*Dev 5

我正在从事一个具有类似背景的项目。我所做的就是根据允许用户使用 API 的情况来建立用户配置文件。为此使用 Sanctum 令牌能力: https://laravel.com/docs/8.x/sanctum#token-ativity

  1. 确保您的 User 类扩展了 Authenticable:
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}
Run Code Online (Sandbox Code Playgroud)
  1. 为您的服务配置文件身份验证创建 API 路由和控制器方法,您可以在其中分配所需的某种类型的特殊令牌功能:
$token = $user->createToken('app-token', ['service'])->plainTextToken;
Run Code Online (Sandbox Code Playgroud)

...其中“服务”将是您要检查的能力。在 /login 端点中返回此令牌作为 API-KEY。

  1. 在每个服务 API 路径上,使用 Sanctum 中间件验证身份验证:
Route::middleware('auth:sanctum')->post('/updatesomething', 'something@update');
Run Code Online (Sandbox Code Playgroud)
  1. 在控制器方法中,验证令牌功能以防止 Web 用户使用它们,反之亦然。理想情况下,您可以使用此逻辑创建一个新的中间件以应用于这些路由。
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您现在可以通过“服务”配置文件使用您的 API,并使用以下请求中 /login 中收到的令牌进行身份验证。您应该将其包含在“承载令牌”之类的标头中。或者,您可以在 API 中创建一个注销方法,并在您认为合适时撤销令牌:

$user->tokens()->delete();
Run Code Online (Sandbox Code Playgroud)