2016-05-10 14 views
6

対私はスリムV2で構築されたAPIを持っていると私は、「認証」ミドルウェア機能を渡して、特定のルートを確保:SLIM Frameworkのルート認証v2とv3の

/** 
    * List marca novos 
    * method GET 
    * url /novos/marca/:idmarca 
    */ 
    $app->get('/novos/marca/:idmarca', 'authenticate', function($idmarca) { 
     $response = array(); 
     $db = new DbHandler('dbnovos'); 


     // fetching marca 
     $marca = $db->getMarcaNovos($idmarca); 

     $response["error"] = false; 
     $response["marca"] = array(); 

     array_walk_recursive($marca, function(&$val) { 
      $val = utf8_encode((string)$val); 
     }); 

     array_push($response["marca"], $marca); 

     echoRespnse(200, $response, "marcaoutput"); 
    })->via('GET', 'POST'); 

認証機能をチェックヘッダの認証値が送信された場合( user_api_key)、データベースと照合します。

私はfolowwingルートでスリムv3のAPIで同じ機能を取得しようとしている:

/** 
    * List marca novos 
    * method GET 
    * url /novos/marca/:idmarca 
    */ 
    $app->get('/novos/marca/{idmarca}', function ($request, $response, $args) { 

    $output = array(); 
    $db = new DbHandler('mysql-localhost'); 
    $marca = $db->getMarcaNovos($args['idmarca']); 

    if ($marca != NULL) { 
     $i = 0; 
     foreach($marca as $m) { 
      $output[$i]["id"] = $m['id']; 
      $output[$i]["nome"] = utf8_encode($m['nome']); 
      $i++; 
     } 

    } else { 
     // unknown error occurred 
     $output['error'] = true; 
     $output['message'] = "An error occurred. Please try again"; 
    } 

    // Render marca view 
    echoRespnse(200, $response, $output, "marca"); 
})->add($auth); 

これは私のミドルウェア

/** 
* Adding Middle Layer to authenticate every request 
* Checking if the request has valid api key in the 'Authorization' header 
*/ 
$auth = function ($request, $response, $next) { 

$headers = $request->getHeaders(); 
$outcome = array(); 

// Verifying Authorization Header 
if (isset($headers['Authorization'])) { 
    $db = new DbHandler('mysql-localhost'); 

    // get the api key 
    $api_key = $headers['Authorization']; 
    // validating api key 
    if (!$db->isValidApiKey($api_key)) { 
     // api key is not present in users table 
     $outcome["error"] = true; 
     $outcome["message"] = "Access Denied. Invalid Api key"; 
     echoRespnse(401, $outcome, $output); 
    } else { 
     global $user_id; 
     // get user primary key id 
     $user_id = $db->getUserId($api_key); 
     $response = $next($request, $response); 
     return $response; 
    } 
} else { 
    // api key is missing in header 
    $outcome["error"] = true; 
    $outcome["message"] = "Api key is missing"; 
    //echoRespnse(400, $response, $outcome); 
    return $response->withStatus(401)->write("Not allowed here - ".$outcome["message"]); 
} 

}; 

あるしかし、私は常にエラーが出ます:「未ここで許可されている - Apiキーが見つからない " 基本的に、$ headers ['Authorization']が設定されている場合のテストは失敗しています。 $ headers配列構造体とは何ですか?または、ヘッダーを介して渡されるAuthorization値を取得するにはどうすればよいですか?

答えて

2

有効なHTTP基本認証ヘッダー以外のものを送信する場合、PHPはアクセスできません。これを回避するには、.htaccessファイルに次の書き換えルールを追加します。

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 
+1

私はpostman chrome appでエンドポイント呼び出しをテストしています。私はトークンを値としてAuthorizationキーを送るだけです。 v2で同じように動作しています。提案されたルールを追加して試してみましたが、出力は同じです。 – mjpramos

関連する問題