laravel中使用jwt,当使用常驻进程时jwt的第二次验证失效是什么原因
背景:
laravel中嵌入workerman,当ws服务端收到指定消息时会发送一个post请求到laravel的一个验证接口(主要是验证jwt token是否有效),过期后自动刷新token,现在的问题是,在第一次验证过期刷新是正常的,后面的token全都是即使过期了也是正常相应,用postman测试接口是正常的。
下面调试打印$users后面几次都是有结果
验证token的中间件
<?php
namespace App\Http\Middleware;
use Closure;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
class RefreshToken extends BaseMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$newToken = null;
$this->auth->unsetToken();
$this->checkForToken($request);
try {
$user = $this->auth->parseToken()->authenticate();
if (!$user) {
return response()->json([
'status_code' => 401,
'message' => '未查询到该用户信息',
'time' => time(),
], 401);
}
var_dump($user); // 后面几次user都是有信息的
} catch (TokenExpiredException $e) {
try {
$newToken = $this->auth->refresh();
$request->headers->set('Authorization', 'Bearer ' . $newToken);
} catch (JWTException $e) {
// 过期用户
return response()->json([
'status_code' => 401,
'message' => '账号信息过期了,请重新登录',
'error' => $e->getMessage(),
'time' => time(),
], 401);
}
} catch (JWTException $e) {
var_dump('JWTException 65');
return response()->json([
'status_code' => 401,
'message' => '登录信息已过期,请重新登录.',
'error' => $e->getMessage(),
'time' => time(),
], 401);
}
$response = $next($request);
if ($newToken) {
$response->headers->set('Authorization', 'Bearer ' . $newToken);
}
return $response;
}
}
初步怀疑是ws常驻进程导致变量内存没释放?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
自己撸了一遍验证代码逻辑,找到了问题点。
当使用ws服务时常驻进程变量释放问题?(推测),最后撸了一遍验证源码,发现是
Tymon\JWTAuth\Manager 中refreshFlow值在第一次刷新token之后就一直是true,导致后续
Tymon\JWTAuth\Validators\PayloadValidator 的check方法中执行的是validateRefresh(刷新token).
解决方法:在刷新token之后加上Tymon\JWTAuth\Manager的属性refreshFlow重新赋值(亲测有效)