用户和客户端有责任保存他的访问令牌代码,客户端应用程序必须制定适当的机制并将密钥存储在安全的地方。
此外,在生成密钥时必须使用安全连接,例如使用 https。
稍后,每当请求登录页面时为用户生成访问令牌将被视为安全漏洞,因为数据库将包含许多有效且可使用且难以跟踪的访问令牌。
因此,处理此问题的首选方法是在创建新的密钥访问令牌后立即删除为用户创建的先前访问令牌。
在 Laravel 7 [See the official documentation] 中推荐的方式是使用事件来跟踪生成并删除旧的:
在 EventServiceProvider 类中,找到 $listen 数组并附加 Passport 侦听器:
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
然后我们执行如下 artisan 命令生成监听器:
php artisan event:generate
然后在App\Listeners\文件夹中找到监听器,在handle方法中输入以下代码:
Token::where([
['user_id', $event->userId],
['id', '<>', $event->tokenId]
])->delete();
通过编写上面的代码,我们告诉 Laravel 通过他的 userID 找到用户访问令牌,他创建了一个新的访问令牌,并且访问令牌 ID 与刚刚生成的新访问令牌 ID 不同。当此数据在数据库中时,意味着用户拥有旧的访问令牌,我们将其删除。
监听类文件内容如下:
<?php
namespace App\Listeners;
use Laravel\Passport\Events\AccessTokenCreated;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Laravel\Passport\Token;
class RevokeOldTokens
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param AccessTokenCreated $event
* @return void
*/
public function handle(AccessTokenCreated $event)
{
Token::where([
['user_id', $event->userId],
['id', '<>', $event->tokenId]
])->delete();
}
}
现在尝试生成一个新的用户访问代码,您会注意到以前的访问令牌已从数据库中删除。