想在每个请求里返回剩余有效时间,代码如下:
namespace app\XXXXXXX\middleware;
use ReflectionClass;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Firebase\JWT\ExpiredException;
class AuthCheckTest implements MiddlewareInterface
{
public function process(Request $request, callable $handler) : Response{
// 通过反射获取控制器哪些方法不需要登录
$controller = new ReflectionClass($request->controller);
$noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? [];
//访问的方法需要登录
if (!in_array($request->action, $noNeedLogin)) {
// 拦截请求,返回一个重定向响应,请求停止向洋葱芯穿越
$token = $request->header('Authorization');
$token=trim(str_ireplace('Bearer ', '', $token));
$key = new Key('XXXXXX', 'HS256'); // 密钥
JWT::$leeway = 10;//当前时间减去60,把时间留点余地
try {
$decoded = JWT::decode($token,$key); //HS256方式,这里要和签发的时候对应
// 如果 Token 有效,$decoded 会包含解码后的数据
$account_id = $decoded->data->account_id;
$create_time = $decoded->nbf;
$useful_time = $decoded->exp;
$last_time = intval($useful_time) - intval($create_time);
return json([
'token_code' => 505,
'剩余时间' => $last_time,
'message' => '其他错误',
]);
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
return json([
'token_code' => 505,
'message' => 'token过期',
]);
}catch(Exception $e) { //其他错误
return json([
'token_code' => 505,
'message' => '其他错误',
]);
}
}
// 如果是options请求则返回一个空响应,否则继续向洋葱芯穿越,并得到一个响应
return $handler($request);
}
}
这样直接return json 不能让他返回吗?要怎么打断这个请求呢?又或者不打断,给每个请求加一个剩余有效时间的字段,怎么加呢?
你这个,设置怎么配的?我都没看懂, 如果对方登陆的时候,勾了记住我,他的令牌时长就是3600秒,不然就是七天,你这个介绍太简单了吧
看到自定义时间了,最大能多少秒有限制吗,7天 30天都可以吗
你自己说了算
还有个问题,如果A用户登录笔记本,给A发了一个令牌,他又在台式机登录,又发给A一个新令牌,那笔记本上的旧令牌会失效吗?