想在每個(gè)請(qǐng)求里返回剩余有效時(shí)間,代碼如下:
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{
// 通過(guò)反射獲取控制器哪些方法不需要登錄
$controller = new ReflectionClass($request->controller);
$noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? [];
//訪問(wèn)的方法需要登錄
if (!in_array($request->action, $noNeedLogin)) {
// 攔截請(qǐng)求,返回一個(gè)重定向響應(yīng),請(qǐng)求停止向洋蔥芯穿越
$token = $request->header('Authorization');
$token=trim(str_ireplace('Bearer ', '', $token));
$key = new Key('XXXXXX', 'HS256'); // 密鑰
JWT::$leeway = 10;//當(dāng)前時(shí)間減去60,把時(shí)間留點(diǎn)余地
try {
$decoded = JWT::decode($token,$key); //HS256方式,這里要和簽發(fā)的時(shí)候?qū)?yīng)
// 如果 Token 有效,$decoded 會(huì)包含解碼后的數(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,
'剩余時(shí)間' => $last_time,
'message' => '其他錯(cuò)誤',
]);
}catch(\Firebase\JWT\ExpiredException $e) { // token過(guò)期
return json([
'token_code' => 505,
'message' => 'token過(guò)期',
]);
}catch(Exception $e) { //其他錯(cuò)誤
return json([
'token_code' => 505,
'message' => '其他錯(cuò)誤',
]);
}
}
// 如果是options請(qǐng)求則返回一個(gè)空響應(yīng),否則繼續(xù)向洋蔥芯穿越,并得到一個(gè)響應(yīng)
return $handler($request);
}
}
這樣直接return json 不能讓他返回嗎?要怎么打斷這個(gè)請(qǐng)求呢?又或者不打斷,給每個(gè)請(qǐng)求加一個(gè)剩余有效時(shí)間的字段,怎么加呢?
中間件直接拋出異常就行了
<?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);
}
}