Problema de middleware JWT da estrutura Slim

Estou tendo um problema com o meu aplicativo slim, estou tentando usar JsonWebToken para autenticação, mas não sei como fazer o caminho certo.

Meu middleware está bloqueando todas as solicitações que não incluem um token válido, mas o que acontece com a primeira solicitação de autenticação que, obviamente, não inclui um token válido. Aqui está o meu código se ele ajuda (no arquivo middleware):

$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; } }); 

Você pode verificar qual rota é chamada dentro do middleware e, em seguida, não verifique se o token da rota atual é a rota de login real.

Para obter a rota dentro do middleware, você precisa primeiro configurar slim para determinar a rota antes do middleware ser executado:

 use Slim\App; $app = new App([ 'settings' => [ 'determineRouteBeforeAppMiddleware' => true ] ]) 

Então você pode acessar a rota atual com $route = $request->getAttribute('route'); dentro do middleware:

Agora você pode verificar se a rota atual é a rota de login

 $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); }); 

Nota: Você precisa definir o nome da Rota com ->setName($name) na rota assim:

 $app->get('/login', function ($request, $response, $args) { // do something })->setName('login'); 
    Intereting Posts