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常驻进程导致变量内存没释放?

阅读 3k
1 个回答

自己撸了一遍验证代码逻辑,找到了问题点。
当使用ws服务时常驻进程变量释放问题?(推测),最后撸了一遍验证源码,发现是
Tymon\JWTAuth\Manager 中refreshFlow值在第一次刷新token之后就一直是true,导致后续
Tymon\JWTAuth\Validators\PayloadValidator 的check方法中执行的是validateRefresh(刷新token).
解决方法:在刷新token之后加上Tymon\JWTAuth\Manager的属性refreshFlow重新赋值(亲测有效)

...
$newToken = $this->auth->refresh();

$this->auth->manager()->setRefreshFlow(false);
...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题