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 协议》,转载必须注明作者和本文链接
推荐文章: