laravel中使用jwt,当使用常驻进程时jwt的第二次验证失效是什么原因

发布于 2022-09-11 19:20:49 字数 2349 浏览 20 评论 0

背景:
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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半世晨晓 2022-09-18 19:20:49

自己撸了一遍验证代码逻辑,找到了问题点。
当使用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);
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文