2016-05-10 23 views
6

Ho un'API costruita con Slim v2 e fissare alcuni percorsi che passano una funzione middleware "autenticare":autenticazione SLIM Framework percorso v2 vs v3

funzione controlla
/** 
    * 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'); 

authenticate se un valore intestazioni di autorizzazione è stato inviato (user_api_key) e lo confronta con il database.

che sto cercando di ottenere la stessa funzionalità in un API v3 Slim con il percorso folowwing:

/** 
    * 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); 

Questo è il mio middleware

/** 
* 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"]); 
} 

}; 

ma ottengo sempre l'errore: "Non consentito qui - Manca la chiave Api " Fondamentalmente, il test se $ headers ['Autorizzazione'] è impostato fallisce. Qual è la struttura dell'array $ headers o come ottengo il valore di autorizzazione passato attraverso l'intestazione?

risposta

2

Se si invia qualcosa di diverso dall'intestazione dell'autorizzazione di base HTTP valida, PHP non potrà accedervi. È possibile aggirare questo problema aggiungendo la seguente regola di riscrittura al file .htaccess.

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

Sto testando la chiamata endpoint con l'app post-chrome. Sto solo inviando la chiave di autorizzazione con il token come valore. Funziona allo stesso modo nella v2, Provato aggiungendo la regola e l'output suggeriti è lo stesso. – mjpramos