jwt-auth 强制用户退出/用户唯一登录

版本

Laravel Framework 5.8.38
tymon/jwt-auth 1.0.1

老板要求, 用户在线唯一登录, 第二次的登录要顶掉第一次的登录,想用jwt自带的方法实现
1建一个token记录表, 记录每一次的token值, 或登录表加一个字段记录token,或者cache
2.第二次登录后,使上一次的token失效

use Tymon\JWTAuth\JWTAuth;
use Tymon\JWTAuth\Manager;
use Tymon\JWTAuth\Token;
class AuthController extends Base
{ 
    protected $manager;
    protected $jwt;
    public function __construct(JWTAuth $jwt,Manager $manager)
    {
        $this->jwt = $jwt;
        $this->manager = $manager;
    }

    public function login(){
        ...登录逻辑

        $last_token='';//获取上次的登录token,存储的是字符串类型
        if($last_token){
            $last_token=$last_token instanceof Token ? $last_token : new Token($last_token);//$last_token必须是object类型才可以, 所以这样处理一下
            $check=$this->manager->decode($lastToken);//补:判断是否已经失效
            if(!$check){
                $this->manager->invalidate($last_token,false);//token失效
                }
        }
        //保存最新的token值
    }
    //补:检查上个登录是否已失效
    protected function checkExp($lastToken){
        try {
            $check=$this->manager->decode($lastToken);
            if($check['ex]<=time()){
                return true;
            }
            else{
                return false;
            }
        }
        catch (\Exception $e){
            //如果已失效会有这样的错误
            return true;
        }
    }
}
下图是token设置和失效方法的来源

jwt-auth 强制用户退出/用户唯一登录

jwt-auth 强制用户退出/用户唯一登录

:这里只是记录下如何用框架自带方法实现.
也多谢大家提供的新思路
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
猪猪

我之前的做法是直接在用户表里面新增一个token字段,每次登录更新这个字段,token的生成是自己生成的秘钥md5(字符串+密码)

1个月前 评论

这不就直接跟scantum一样了吗

1个月前 评论

没发现一个很奇怪问题吗,这个库支持黑名单,那黑名单的数据存放在哪里呢?

1个月前 评论
ononl 1个月前
XiaohuiLam 1个月前

redis使用set建立用户登录token,并且设置过期时间。如果后续有账号登录,原来的token就失效,更新用户对应的token,并且把原来的token加入到黑名单,也设置一个过期时间,不比数据库简单吗

1个月前 评论

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