[已解决] Passport 实现多端登陆且只不生成多余的 token

设计

登陆:

  • 前端传入账户密码来请求服务端 (Laravel Passport 密码授权令牌)
  • 若数据库内已有 token 存在,则返回已存在的 token
  • 若数据库中无 token,则创建新的 token 并返回。

问题

数据库中存在的 token 不是 access_token,在网上查找过后,只有根据 token 获取用户信息,没有根据 token 获取 access_token 的方法。

期望

请问如何才能根据 token 获取 access_token
或者如何才能用 Laravel Passport 实现多端登陆且只在数据库中储存一条 token 记录?

解决方法

在初次请求时,将 access_tokenrefresh_token 储存到 Redis
当再次请求时,先从 Redis 中获取,若存在则返回,否则请求 /oauth/token 以生成 tokens

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4
curder

登陆之前先判断是否已经存在,如果存在就回收了。

另外还需要定时清除已经标记为过期的记录…

5年前 评论
Clusteramaryllis (楼主) 5年前

这个问题怎么搞啊,那个oatuh_refresh_token表里会产生大量无用的数据。。。

5年前 评论
Clusteramaryllis (楼主) 5年前
aidybnt (作者) 5年前

看了laravel自带的users表里,默认带一个remeber_token,应该是用来解决这个问题的。

5年前 评论

可以通过事件去处理。

protected $listen = [
    \Laravel\Passport\Events\AccessTokenCreated::class => [
        \App\Listeners\RevokeOldToekns::class,
    ],   
];
<?php

namespace App\Listeners;

use Laravel\Passport\Events\AccessTokenCreated;
use Laravel\Passport\Token;

class RevokeOldToekns
{
    public function handle(AccessTokenCreated $event)
    {
        Token::where('id', '<>', $event->tokenId)
             ->where('user_id', $event->userId)
             ->where('client_id', $event->clientId)
             ->where('revoked', 0)
             ->update(['revoked' => 1]);
    }
}
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!