Slim 框架 JWT 中间件问题
Slim framework JWT middleware Issue
我的 slim 应用程序有问题,我正在尝试使用 JsonWebToken 进行身份验证,但我不知道如何以正确的方式进行。
我的中间件阻止了所有不包含有效令牌的请求,但是第一个明显不包含有效令牌的身份验证 post 请求呢?
如果有帮助,这是我的代码(在中间件文件中):
$app->add(function (Request $request,Response $response, $next) use ($app){
$stringToken = $request->getHeader("Authorization")[0];
if($stringToken == NULL) {
return $response->withJson(array("Connection"=>"Fail On Token", "Error"=>"No token Provided."));
} else {
$jsonObjectToken = json_decode($stringToken);
try{
JWT::decode($jsonObjectToken->jwt, JWTController::$secretKey, array('HS512'));
}catch (Exception $e){
return $response->withJson(array("Connection"=>"Fail On Token", "Error"=>$e->getMessage()));
}
$response = $next($request, $response);
return $response;
}
});
可以在中间件内部检查调用了哪个路由,然后不检查当前路由的token是否为实际登录路由。
要获取中间件内部的路由,您需要先配置 slim 以在中间件执行之前确定路由:
use Slim\App;
$app = new App([
'settings' => [
'determineRouteBeforeAppMiddleware' => true
]
])
然后就可以在中间件里面用$route = $request->getAttribute('route');
访问当前路由了:
现在可以查看当前路由是否为登录路由
$app->add(function (Request $request, Response $response, callable $next) {
$route = $request->getAttribute('route');
$name = $route->getName();
if($name !== 'login') {
// do authentication
}
return $next($request, $response);
});
注意:您需要在路由上设置带有->setName($name)
的路由名称,如下所示:
$app->get('/login', function ($request, $response, $args) {
// do something
})->setName('login');
我的 slim 应用程序有问题,我正在尝试使用 JsonWebToken 进行身份验证,但我不知道如何以正确的方式进行。
我的中间件阻止了所有不包含有效令牌的请求,但是第一个明显不包含有效令牌的身份验证 post 请求呢? 如果有帮助,这是我的代码(在中间件文件中):
$app->add(function (Request $request,Response $response, $next) use ($app){
$stringToken = $request->getHeader("Authorization")[0];
if($stringToken == NULL) {
return $response->withJson(array("Connection"=>"Fail On Token", "Error"=>"No token Provided."));
} else {
$jsonObjectToken = json_decode($stringToken);
try{
JWT::decode($jsonObjectToken->jwt, JWTController::$secretKey, array('HS512'));
}catch (Exception $e){
return $response->withJson(array("Connection"=>"Fail On Token", "Error"=>$e->getMessage()));
}
$response = $next($request, $response);
return $response;
}
});
可以在中间件内部检查调用了哪个路由,然后不检查当前路由的token是否为实际登录路由。
要获取中间件内部的路由,您需要先配置 slim 以在中间件执行之前确定路由:
use Slim\App;
$app = new App([
'settings' => [
'determineRouteBeforeAppMiddleware' => true
]
])
然后就可以在中间件里面用$route = $request->getAttribute('route');
访问当前路由了:
现在可以查看当前路由是否为登录路由
$app->add(function (Request $request, Response $response, callable $next) {
$route = $request->getAttribute('route');
$name = $route->getName();
if($name !== 'login') {
// do authentication
}
return $next($request, $response);
});
注意:您需要在路由上设置带有->setName($name)
的路由名称,如下所示:
$app->get('/login', function ($request, $response, $args) {
// do something
})->setName('login');