想在每個請求里返回剩余有效時間,代碼如下:
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方式,這里要和簽發(fā)的時候?qū)? // 如果 Token 有效,$decoded 會包含解碼后的數(shù)據(jù)
$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請求則返回一個空響應,否則繼續(xù)向洋蔥芯穿越,并得到一個響應
return $handler($request);
}
}
這樣直接return json 不能讓他返回嗎?要怎么打斷這個請求呢?又或者不打斷,給每個請求加一個剩余有效時間的字段,怎么加呢?
直接用它不好嗎?http://www.wtbis.cn/plugin/10
中間件直接拋出異常就行了
<?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);
}
}