2013-01-22 19 views
7

Ich baue eine RESTful API mit Laravel mit der RESTful Controller-Eigenschaft. Bisher konnte ich das meiste davon zum Laufen bringen. Das Problem ist jetzt Authentifizierung, ich versuche Amazon Ansatz mit einer "user_id" und "Signatur" zu verwenden. Erstelle die Signatur mit Hilfe von 'hash_hmac()' von PHP.REST API Authentisierung mit Laravel

dies ein Beispiel api Controller

class Api_Tasks_Controller extends Api_Controller { 

    public $restful = true; 

    public function get_index($id = null) { 

     $this->verfiy_request(); 

     if(!is_null($id)) 
     { 
      return Response::json(array("tasks"=>"just one"),200); 
     } 
     else 
     { 
      return Response::json(array("tasks"=>"everthing"),200); 
     } 
    } 


} 

und dies der api Controller-Klasse

class Api_Controller extends Controller { 

    public function verify_request() { 

     //user id 
     $user_id = (int) Input::get('user_id'); 
     //signature 
     $sig = Input::get('sig'); 

     //Lookup user 
     $user = Sentry::user($user_id); 
     if($user) { 
      //user email 
      $email = $user->email; 
      //user api key 
      $api_key = $user->metadata['api_key']; 
      //recreate signature 
      $_sig = hash_hmac("sha256",$email.$user_id,$api_key); 
      if($_sig === $sig) { 
       return Response::json(array("message"=>"Request Ok"),200); 
      } 
      else { 
       return Response::json(array("message"=>"Request Bad"),400); 
      } 
     } 
     else { 

      return Response::json(array("message"=>"Request not authorized"),401); 
     } 
    } 

eine GET-Anfrage zu machen http://api.xyz.com/v1/tasks/1?user_id=1&sig=41295da38eadfa56189b041a022c6ae0fdcbcd5e65c83f0e9aa0e6fbae666cd8 immer eine Erfolgsmeldung zurückgibt, auch wenn ich den Wert des User_id Parameter verändern, die sollte die Signatur ungültig machen und die Anfrage ungültig machen. Es scheint, dass meine verfiy_request Methode nicht ausgeführt wird. Bitte helfen Sie mir

Antwort

9

Ich habe auch das kürzlich erforscht und auch mit Filtern gehen würde empfehlen. Es könnte so etwas wie dies funktionieren:

class Api_Tasks_Controller extends Base_Controller { 

    public $restful = true; 

    function __construct() { 
     // Check if user is authorized 
     $this->filter('before', 'api_checkauth'); 
    } 

    // rest of the class .... 

} 

Und in Ihrer routes.php Datei:

Route::filter('api_checkauth', function() 
{ 
    //user id 
    $user_id = (int) Input::get('user_id'); 

    //signature 
    $sig = Input::get('sig'); 

    try { 
    //Lookup user 
    $user = Sentry::user($user_id); 

    if($user) { 
     //user email 
     $email = $user->email; 
     //user api key 
     $api_key = $user->metadata['api_key']; 
     //recreate signature 
     $_sig = hash_hmac("sha256",$email.$user_id,$api_key); 
     if($_sig === $sig) { 
      return Response::json(array("message"=>"Request Ok"),200); 
     } 
     else { 
      return Response::json(array("message"=>"Request Bad"),400); 
     } 
    } 
    else { 
     return Response::json(array("message"=>"Request not authorized"),401); 
    } 
    } 
    catch (Sentry\SentryException $e) { 
    $errors = $e->getMessage(); // catch errors such as user not existing or bad fields 
    return Response::json(array("message"=>$errors),404); 
    } 

}); 

Auch dank für mich :-) Einführung Sentry

+0

Sie schicken $ sig und $ userId in der Anfrage selbst. Glaubst du nicht, dass jemand diese Parameter schnüffeln und sich in deinem Namen authentifizieren kann? – voila

+0

Große Frage! Und ja, Sie haben Recht, dass diese Elemente abgefangen werden können. Ich denke, dass Amazon eine Art Methode verwendet, um die URL nach einer gewissen Zeit aus diesem Grund ablaufen zu lassen. Ich habe nicht unbedingt versucht, die Authentifizierungswahl dieser Person zu untersuchen, sondern gezeigt, wie man Filter in Laravel verwendet. – jonahlyn

2

Es ist eine schnelle Schätzung, ich habe nicht versucht, aber vielleicht möchten Sie versuchen, eine Rückgabeanweisung vor dem Aufruf von verify_request hinzuzufügen.

Und Sie sollten filters Blick in die es Ihnen erlauben, mehr Ihre api Logik und api Authentifizierung zu trennen ;-)