慕容的工作随笔

慕容的工作随笔

记录学习和工作

【转载】Laravel Sanctum 的使用

转自:https://learnku.com/articles/66246

https://learnku.com/laravel/t/43077

https://learnku.com/laravel/t/52650

重写默认模型

由于 laravel 自带的表名叫 personal_access_tokens,开发中我们习惯用户表名叫 users,所以我们可以将表名修改为 user_tokens

1、创建 UserToken 模型文件

php artisan make:model UserToken
模型文件 UserToken.php 内容如下:
<?php

namespace App</span>Models;

use Laravel</span>Sanctum</span>PersonalAccessToken as SanctumPersonalAccessToken;
use DateTimeInterface;

class UserToken extends SanctumPersonalAccessToken
{
// 转换时间格式
protected function serializeDate(DateTimeInterface $dateTime): string
{
return $dateTime->format(‘Y-m-d H:i:s’);
}
}

2、设置模型名称

在 app/Providers/AuthServiceProvider.php 文件中,调用 usePersonalAccessTokenModel 方法设置访问令牌模型名称:
use App\Models\UserToken;
use Laravel\Sanctum\Sanctum;

/**

  • 引导应用程序服务。
  • @return void
    */
    public function boot()
    {
    $this->registerPolicies();
    // 设置访问令牌模型名称
    Sanctum::usePersonalAccessTokenModel(UserToken::class);
    }
这样重写默认模型就完成了

自定义验证

我们在实际开发中,验证规则可能会需要做一些自定义的操作,所以我们可以通过回调函数来进行自定义验证,里面的就可以写一些我们自定义的逻辑内容:

指定验证访问令牌的回调

在 app/Providers/AuthServiceProvider.php 文件中,调用 authenticateAccessTokensUsing 方法指定验证访问令牌的回调
use App\Models\UserToken;
use Laravel\Sanctum\Sanctum;

/**

  • 引导应用程序服务。
  • @return void
    */
    public function boot()
    {
    $this->registerPolicies();
    // 验证访问令牌的回调
    Sanctum::authenticateAccessTokensUsing(
    static function (PersonalAccessToken $accessToken, bool $isValid) {
    // 你的自定义逻辑
    }
    );
    }
$accessToken 为 token 信息,tokenable 包含了用户基本信息,token 过期时 tokenable 字段就不会再返回
Laravel Sanctum 自定义访问令牌
$isValid 为 token 有效状态,当 token 未过期时返回 true,否则就返回 false
Laravel Sanctum 自定义访问令牌

自定义令牌有效期

Sanctum 可以在 config/sanctum.php 配置文件中通过 expiration 来设置过期时间,单位为分钟,但无法灵活地设置过期时间

1、设置短期令牌

(1)创建令牌时,对令牌设置令牌能力 server:limited :
$user->createToken('token-name', ['server:limited'])->plainTextToken;
(2)在 app/Providers/AuthServiceProvider.php 文件中根据令牌能力设置过期时间:
如果令牌有效,就将 token 过期时间设置为自定义的过期时间,下面 now ()->subMinutes (5) 表示有效期为 5 分钟
 public function boot()
 {
     $this->registerPolicies();
     // 验证访问令牌的回调
     Sanctum::authenticateAccessTokensUsing(
         static function (PersonalAccessToken $accessToken, bool $isValid) {
             if (!$accessToken->can('server:limited')) {
                return $isValid;
             }
             return $isValid && $accessToken->created_at->gt(now()->subMinutes(5));
         }
     );
 }

2、设置一次性访问令牌

(1)创建令牌时,对令牌设置令牌能力 server:once :
$user->createToken('token-name', ['server:once'])->plainTextToken;
(2)在 app/Providers/AuthServiceProvider.php 文件中根据令牌能力设置过期时间:
如果令牌有效,并且未登陆过,就将 token 设置为失效,即可实现一次性令牌效果
 public function boot()
 {
     $this->registerPolicies();
     // 验证访问令牌的回调
     Sanctum::authenticateAccessTokensUsing(
         static function (PersonalAccessToken $accessToken, bool $isValid) {
             if (!$accessToken->can('server:once')) {
                return $isValid;
             }
             return $isValid && $accessToken->last_used_at ===  null;
         }
     );
 }

评论 (0)

还没有评论,来做第一个吧。

发表评论

提交后需管理员审核通过后显示