中间件用Firebase\JWT\JWT 怎么返回剩余有效时间?

914739959

问题描述

想在每个请求里返回剩余有效时间,代码如下:

代码

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 不能让他返回吗?要怎么打断这个请求呢?又或者不打断,给每个请求加一个剩余有效时间的字段,怎么加呢?

517 2 1
2个回答

Tinywan

直接用它不好吗?https://www.workerman.net/plugin/10

  • 914739959 2023-11-30

    你这个,设置怎么配的?我都没看懂, 如果对方登陆的时候,勾了记住我,他的令牌时长就是3600秒,不然就是七天,你这个介绍太简单了吧

  • 914739959 2023-11-30

    看到自定义时间了,最大能多少秒有限制吗,7天 30天都可以吗

  • Tinywan 2023-11-30

    你自己说了算

  • 914739959 2023-12-09

    还有个问题,如果A用户登录笔记本,给A发了一个令牌,他又在台式机登录,又发给A一个新令牌,那笔记本上的旧令牌会失效吗?

Tinywan

中间件直接抛出异常就行了

<?php
/**
 * @desc AuthorizationMiddleware
 * @author Tinywan(ShaoBo Wan)
 * @email 756684177@qq.com
 * @date 2020/4/7 22:52
 */

declare(strict_types=1);

namespace app\middleware;

use Tinywan\ExceptionHandler\Exception\ForbiddenHttpException;
use Tinywan\Jwt\JwtToken;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

class AuthorizationMiddleware implements MiddlewareInterface
{
    /**
     * @param Request $request
     * @param callable $handler
     * @return Response
     * @throws ForbiddenHttpException
     */
    public function process(Request $request, callable $handler): Response
    {
        $request->userId = JwtToken::getCurrentId();
        if (0 === $request->userId) {
            throw new ForbiddenHttpException();
        }
        return $handler($request);
    }
}
  • 暂无评论
🔝