我正在使用Laravel通行证来实现API,当用户登录网站时,它创建了一个新令牌,旧令牌被吊销了,因为该记录每天都在增加。.
反正有没有删除护照过期的令牌?
谢谢。
答案 0 :(得分:4)
我们将使用this命令清除吊销和过期的令牌:
<?php
namespace App\Console;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('passport:purge')->dailyAt('03:00');
}
}
答案 1 :(得分:3)
来晚了,但是总有人会觉得有用。
您可以使用通行证事件来代替设置CRON作业。创建访问令牌和创建刷新令牌时,Passport会发出事件。您需要做的就是在EventServiceProvider
中注册此事件,然后调用php artisan event:generate
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
'App\Listeners\PruneOldTokens',
],
];
然后在App\Listeners\PruneOldTokens
中,您可以删除用户之前拥有的所有其他令牌:
/**
* Handle the event.
*
* @param AccessTokenCreated $event
* @return void
*/
public function handle(AccessTokenCreated $event)
{
Token::where([
['user_id', $event->userId],
['id', '<>', $event->tokenId]
])->delete();
}
别忘了在顶部导入Laravel\Passport\Token
。
注意:我还将在刷新令牌创建事件中删除过期的刷新令牌。只需将其添加到侦听器中,即可创建刷新令牌事件。这样,每次为某个用户创建新的刷新令牌时,所有过期的令牌都会被删除。
/**
* Handle the event.
*
* @param RefreshTokenCreated $event
* @return void
*/
public function handle(RefreshTokenCreated $event)
{
\DB::table('oauth_refresh_tokens')
->whereDate('expires_at', '<', now()->addDays(1))
->delete();
}
答案 2 :(得分:2)
您应该为此使用CRON作业。 只需发出一个命令(例如,每天一次)在DB表中查询被吊销的令牌,然后删除该记录。
php artisan make:command DeleteRevokedTokens
它将在app/Console/Commands
中生成该文件。
在该命令Eloquent
方法中编写该handle()
逻辑。
在$signature
变量中为该命令命名,并在$description
变量中为其描述。
然后进入app/Console/Kernel.php
并在schedule()
方法中添加一行
$schedule->command('yourCommandNameThatYouWroteInSignatureVariableOfYourCommand')->dailyAt('00:00');
就是这样。现在,您只需要打开CRON jobs
。它对开发无用,但必须在生产中使用。
要测试您的命令,只需在终端php artisan yourCommandNameHere
中写入,其中yourCommandName
是该命令的$signature
变量。因此,当您编写它时,它将执行它。当您在app/Console/Kernel.php
中设置该命令时,Cron作业只会处理该命令是否自动启动。
答案 3 :(得分:1)
Artisan控制台命令:
php工匠护照:清除
答案 4 :(得分:0)
这将注销用户并同时删除令牌。
public function logout ()
{
$tokenRepository = app('Laravel\Passport\TokenRepository');
$user = auth('api')->user();
if ($user) {
$tokenRepository->revokeAccessToken($user->token()->id);
$user->token()->delete();
return response()->json(['status', 'Logged Out']);
} else {
return response()->json(['status', 'Already Logged Out']);
}
}