laravel api 简单做到唯一登陆的办法

给用户模型添加字段

首先,在你的用户模型(如 users)中添加一个 jti 字段来存储最新的 token ID

在login接口添加逻辑

// 更新用户的 jti
$users->jti = $jti;
$users->save();

// 生成 token 并包含 jti
$customClaims = ['jti' => $jti];
if (!$token = auth('storeapi')->claims($customClaims)->fromUser($users)) {
    return response()->json([
        'code'   => 500,
        'msg'    => '登录失败',
        'status' => 0,
        'data'   => (object)[],
    ]);
}

在中间件中添加验证逻辑

try {
            $admin = auth::guard('storeapi')->authenticate($token);

            // 检查 token 是否是最新的
            $tokenJti = JWTAuth::getPayload()->get('jti');
            if ($admin->jti !== $tokenJti) {
                return response()->json([
                    'code' => 403,
                    'msg' => 'token已失效,请在最新设备登录',
                    'status' =>'error',
                    'data'  => (object)[],
                ], 402);
            }
            //addlogsUpUid($logid,['user_id'=> $admin->id]);
        } catch (TokenExpiredException $e) {
            return response ()->json ([
                'code'  => 403,
                'status' => 'error',
                'msg'   => 'token过期',
                'data'  => [],
            ], 402);
        }

总结

在登陆时把token ID 更新上去,然后在中间件去获取 token ID 与字段上的值去比对校验是否一致,如果不一致,token就不是最新的。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Dcat-Admin (plus版)是汇聚Filament,Laravel-admin , Dcat-admin 优点于一身的基于Laravel + Bootstrap 的极速开发框架
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

如果用的是sanctum的话,直接删除旧的token,然后再登录,也是可以的

// 删除用户的旧 Token(保证唯一性)
$user->tokens()->delete();
10小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
Dcat-plus Admin @ 速码邦
文章
38
粉丝
54
喜欢
194
收藏
157
排名:399
访问:2.3 万
私信
所有博文
社区赞助商