Laravel使用Passport密码授权
时,默认同一个账号是可以同时在多个地方登录的,这样数据库中同一个账号会产生多个AccessToken
和RefreshToken
,现在我们要实现的就是当一个账号登录时,清除掉它之前在其他地方登录时生成的AccessToken
和RefreshToken
。
Passport密码授权
有两个事件,一个是AccessTokenCreated
,一个是RefreshTokenCreated
,这里我们监听第一个事件就可以了。
配置监听项
在app/Providers/EventServiceProvider
中增加监听项:
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\Auth\RevokeOldTokens',
],
];
生成监听器
php artisan event:generate
增加监听代码
执行命令后目录App\Listeners\Auth\
下会生成监听文件RevokeOldTokens.php
,修改handle
函数如下:
/**
* Handle the event.
*
* @param AccessTokenCreated $event
* @return void
*/
public function handle(AccessTokenCreated $event)
{
$tokenIdArr = Token::where('id', '!=', $event->tokenId)
->where('user_id', $event->userId)
->pluck('id')->toArray();
DB::table('oauth_refresh_tokens')->whereIn('access_token_id', $tokenIdArr)
->delete();
Token::where('id', '!=', $event->tokenId)
->where('user_id', $event->userId)
->delete();
}
至此,用户通过接口授权时,会自动清掉之前生成过的全部AccessToken
和RefreshToken