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设置和失效方法的来源
补:这里只是记录下如何用框架自带方法实现.
也多谢大家提供的新思路
本作品采用《CC 协议》,转载必须注明作者和本文链接
我之前的做法是直接在用户表里面新增一个token字段,每次登录更新这个字段,token的生成是自己生成的秘钥md5(字符串+密码)
这不就直接跟scantum一样了吗
没发现一个很奇怪问题吗,这个库支持黑名单,那黑名单的数据存放在哪里呢?
redis使用set建立用户登录token,并且设置过期时间。如果后续有账号登录,原来的token就失效,更新用户对应的token,并且把原来的token加入到黑名单,也设置一个过期时间,不比数据库简单吗