[已解决] 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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4
curder

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

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

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

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

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

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

4年前 评论

可以通过事件去处理。

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]);
    }
}
4年前 评论

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