0

スリムなアプリケーションに問題があります。認証にJsonWebTokenを使用しようとしていますが、正しい方法で行う方法がわかりません。スリムフレームワークJWTミドルウェア問題

私のミドルウェアは、有効なトークンを含んでいないすべての要求をブロックしていますが、明らかに有効なトークンを含んでいない最初の認証投稿要求はどうでしょうか?それは(ミドルウェア・ファイルに)場合に役立ちます は、ここに私のコードです:

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

私はスリム3を使用しています – Meshredded

答えて

2

あなたはミドルウェア内部で呼び出され、その後、現在のルートのトークンをチェックしないルートを確認することができますが、実際のログインルートです。あなたはミドルウェアが実行される前にルートを確定するためにスリムな設定に最初に必要なミドルウェアの内部でルートを取得するための

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'); 
関連する問題