Laravel Sanctum 优雅实现api登录功能

1,763 阅读2分钟

Sanctum官网地址:learnku.com/docs/larave…

Passport官网地址:learnku.com/docs/larave…

介绍

Laravel Sanctum 提供了一个轻量级的认证系统,可用于 SPA(单页应用程序)、移动应用程序和基于简单令牌的 API。Sanctum 允许的应用程序中的每个用户为他们的账户生成多个 API 令牌。这些令牌可以被授予权限 / 范围,以指定令牌允许执行哪些操作。 除非您需要所有的oauth服务,否则还是更推荐您使用轻量级的Sanctum进行认证处理

Passport登录:juejin.cn/post/721104…

开始使用

  1. 利用composer进行安装
composer require laravel/sanctum
  1. 发布配置文件和服务提供者
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
  1. 数据库迁移
php artisan migrate
  1. 接下来,如果你打算使用 Sanctum 来对 SPA 单页应用程序进行认证,则应该将 Sanctum 的中间件添加到你的应用程序的 app/Http/Kernel.php 文件中的 api 中间件组中:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
   \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
   \Illuminate\Routing\Middleware\SubstituteBindings::class,
],
  1. 用户模型中Sanctum 允许你发行 API 令牌 / 个人访问令牌,可用于对你的应用程序的 API 请求进行身份验证。使用 API 令牌发出请求时,应将令牌作为 Bearer 令牌包括在 Authorization 头中。

要开始为用户发行令牌,你的用户模型应该使用 Laravel\Sanctum\HasApiTokens trait:

image.png

  1. 要发行令牌,你可以使用 createToken 方法。createToken 方法会返回一个 Laravel\Sanctum\NewAccessToken 实例。在将 API 令牌存储到数据库之前,令牌将使用 SHA-256 哈希进行哈希处理,但是你可以通过 NewAccessToken 实例的 plainTextToken 属性访问令牌的明文值。你应该在令牌被创建后立即将其值显示给用户:
$user = app(User::class)->findForPassport($inputs['username']);
$token = $user->createToken($user->nickname, ['*'], null)->plainTextToken;

您可以根据在use Laravel\Sanctum\HasApiTokens的类中进行调用该方法,方法存在三个参数

image.png 7. 路由保护,在需要授权的路由上使用中间件auth:sanctum

Route::get('index', function(){
    return 'success';
})->middleware(['auth:sanctum', 'abilities:test-abilitie']);
  1. 令牌有效期,您可以在config/sanctum.php中进行设置expiration属性,单位为分
  2. 如您需要使用作用域
Sanctum 还包括两个中间件,可用于验证传入的请求是否使用授予了给定能力的令牌进行了身份验证。首先,请将以下中间件添加到应用程序的 app/Http/Kernel.php 文件的 $middlewareAliases 属性中:
'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class,
'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class,

可以将 abilities 中间件分配给路由,以验证传入请求的令牌是否具有所有列出的能力:

Route::get('/orders', function () {
    // 令牌具有「check-status」和「place-orders」能力...
})->middleware(['auth:sanctum', 'abilities:check-status,place-orders']);

可以将 ability 中间件分配给路由,以验证传入请求的令牌是否至少具有一个列出的能力:

Route::get('/orders', function () {
    // 令牌具有「check-status」或「place-orders」能力...
})->middleware(['auth:sanctum', 'ability:check-status,place-orders']);