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');