Laravel Sanctum 的使用

本文介绍了如何在Laravel中重写Sanctum的默认PersonalAccessToken模型,将其改为UserToken,并设置模型名称。同时,讲解了如何通过回调函数自定义验证规则以及如何灵活设置令牌的有效期,包括短期令牌和一次性访问令牌的实现方法。
摘要由CSDN通过智能技术生成

重写默认模型

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

1、创建 UserToken 模型文件

php artisan make:model UserToken

模型文件 UserToken.php内容如下:

<?php

namespace App\Models;

use Laravel\Sanctum\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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值