Laravel护照可防止用户使用同一凭证登录

时间:2019-07-22 05:12:43

标签: php laravel laravel-passport

我正在使用Laravel Passport允许我的手机调用laravel api以使用laravel身份验证。

我最近发现了一个问题,这是Laravel Passport允许同一用户从多个设备登录。我有什么解决方案可以阻止同一用户同时登录其他设备?

我找到了一种使用Laravel Passport注销的方法,但我不知道这是否是我使用

的最佳方法
$request->user()->token()->revoke()

每当用户尝试登录时。

4 个答案:

答案 0 :(得分:1)

您可以挂起AccessTokenCreated事件,然后在侦听器中可以撤消任何现有令牌。

将这些事件/听众添加到您的EventServiceProvider

'Laravel\Passport\Events\AccessTokenCreated' => [
    'App\Listeners\RevokeExistingTokens',
],

然后使用php artisan make:listener RevokeExistingTokens

创建一个侦听器

然后在handle函数内部:

$user = User::find($event->userId);

$user->tokens()->offset(1)->get()->map(function ($token) {
    $token->revoke();
});

这将删除除刚刚创建的用户令牌以外的所有用户令牌。

答案 1 :(得分:1)

考虑@Lucas Dalmarco对有关MySQL“偏移”命令问题的@atymic答案发表评论。这是可以实施的解决方法。

$user = User::find($event->userId);

$user->tokens()->limit(PHP_INT_MAX)->offset(1)->get()->map(function ($token) {
    $token->revoke();
});

答案 2 :(得分:0)

不正确的答案不只是正确的,但是在某些版本的MySQL中,“偏移”方法可能会出现问题,因此您可以在“处理”函数中做到这一点:

 Token::where('id', '!=', $event->tokenId)
    ->where('user_id', $event->userId)
    ->where('client_id', $event->clientId)
    ->delete();

答案 3 :(得分:0)

Laravel Passport 已经为此提供了事件。请检查一下document

Passport 在颁发访问令牌和刷新令牌时引发事件。您可以使用这些事件来修剪或撤销数据库中的其他访问令牌。如果您愿意,您可以在应用程序的 App\Providers\EventServiceProvider 类中为这些事件附加侦听器:

/**
 * 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',
    ],
];