2016-05-10 5 views
6

Ich habe eine API mit Slim v2 gebaut und ich sichern bestimmte Strecken eine Middleware-Funktion „authentifizieren“ vorbei:SLIM Framework Route Authentifizierung v2 vs 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'); 

Die authenticate Funktion prüft, ob ein Wert Header Authorization gesendet wurde (user_api_key) und prüft sie gegen die Datenbank.

Ich versuche, die gleiche Funktionalität in einem schlanken v3 API mit der folowwing Route zu bekommen:

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

Dies ist meine 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"]); 
} 

}; 

Aber ich den Fehler immer erhalten: „Nicht hier erlaubt - Api-Schlüssel fehlt " Grundsätzlich ist der Test fehlgeschlagen, wenn $ headers ['Authorization'] gesetzt ist. Was ist die $ headers array Struktur oder wie bekomme ich den Authorization Wert durch den Header?

Antwort

2

Wenn Sie etwas anderes als den gültigen HTTP Basic Authorization-Header senden, hat PHP keinen Zugriff darauf. Sie können das umgehen, indem Sie Ihrer .htaccess-Datei die folgende Rewrite-Regel hinzufügen.

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

Ich teste den Endpunkt Anruf mit Postbote Chrom App. Ich sende nur den Autorisierungsschlüssel mit dem Token als Wert. Funktioniert auf die gleiche Weise in v2, versucht, Ihre vorgeschlagene Regel und Ausgabe ist die gleiche. – mjpramos