在Laravel中,是否有办法删除旧的已撤销/已过期的护照令牌

时间:2019-02-06 09:09:04

标签: php laravel oauth-2.0 laravel-passport

我正在使用Laravel通行证来实现API,当用户登录网站时,它创建了一个新令牌,旧令牌被吊销了,因为该记录每天都在增加。.

反正有没有删除护照过期的令牌?

谢谢。

5 个答案:

答案 0 :(得分:4)

Laravel样式

我们将使用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']);
    }

}