2013-08-18 2 views
1

J'essaie de créer un adaptateur Auth personnalisé pour une API héritée. Appelons l'adaptateur TR42. En ce moment, je suis débogage TR42::check() donc je suis en utilisant des valeurs codées en dur:Comment soumettre POST pour cURL dans Lithium

<?php 
class TR42 extends \lithium\core\Object { 

    public function __construct(array $config = []) { 
     $defaults = [ 
      'scheme' => 'http', 
      'host' => 'localhost/tr42/mock_api_authenticate.php', 
      'action' => 'authLookup', 
      'fields' => ['username', 'password'], 
      'method' => 'POST' 
     ]; 
     parent::__construct($config + $defaults); 
    } 

    public function check($credentials, array $options = []) { 
     $postConfig = [ 
      /** 
      * Should I be using 'body' or 'query' to submit POST fields? 
      */ 
      'body' => [ 
       'username' => 'housni', 
       'password' => sha1('legacyHashedPassword'), 
       'action' => 'authLookup' 
      ], 
      'query' => 'username=housni&password=' . sha1('legacyHashedPassword') . '&action=authLookup', 
     ]; 
     $request = new Request($postConfig + $this->_config); 

     $stream = new Curl($this->_config); 
     $stream->open(); 
     $stream->write($request); 
     $response = $stream->read(); 
     $stream->close(); 

     echo '<pre>' . print_r($response, true) . '</pre>'; 
     die(); 
    } 
} 
?> 

Le fichier http://localhost/tr42/mock_api_authenticate.php ressemble à ceci:

<?php 
echo '<h1>This request is: ' . $_SERVER['REQUEST_METHOD'] . '</h1>'; 
if (!empty($_POST)) { 
    echo '<h1>YAY</h1>'; 
} else { 
    echo '<h1>NAY</h1>'; 
} 

echo '<pre>' . print_r($_POST, true) . '</pre>'; 
?> 

Depuis mon code cURL soumet une requête POST, je pense mon _POST $ à être placés dans mock_api_authenticate.php mais qui ne se produit pas parce que la sortie de Tr42 :: check() de print_r() est:

HTTP/1.1 200 OK 
Date: Sun, 18 Aug 2013 04:46:34 GMT 
Server: Apache/2.2.14 (Ubuntu) 
X-Powered-By: PHP/5.4.17-1~lucid+1 
Vary: Accept-Encoding 
Content-Length: 63 
Connection: close 
Content-Type: text/html 

This request is: POST 

NAY 

Array 
(
) 

Il veut tout dire req uest est POST mais le tableau POST (le dernier tableau vide) est vide.

Qu'est-ce que je fais mal?

Merci pour la lecture :)

Répondre

1

je suggère l'utilisation du lithium Connections et Service les classes, pour éviter d'écrire votre demande boucle de cette façon.

Extrait la configuration de votre connexion api héritage (hôte, port, etc.) à une connexion nommée « api » ou autre chose, puis, dans votre corps de l'adaptateur check(), écrire quelque chose comme:

public function check($credentials, array $options = []) { 
    return Connections::get('api')->connection->post('/tr42/mock_api_authenticate.php', $credentials); 
} 
+0

Je ne suis pas sûr Je comprends comment ils vont tous ensemble. Pouvez-vous élaborer plus, s'il vous plaît? Êtes-vous en train de dire que TR42 devrait résider dans 'extensions \ adapter \ security \ auth \ TR42' et que les connexions pour' api' de 'type' =' Http' et 'adapter' =' TR42' devraient implémenter cette vérification? Je suppose que ce qui me dégoûte est la façon dont la connexion a une méthode 'post()' qui semble provenir de 'Service'. Je suis encore assez nouveau pour certaines parties de Lithium :) – Housni

+0

En outre, cet adaptateur TR42 est seulement une API d'authentification, il ne sera pas utilisé comme source de données. – Housni

+1

Si je comprends le problème, vous aurez un adaptateur auth TR42 qui implémente la méthode check(), où vous avez besoin de POST des données d'identification à un point de terminaison http quelque part. Vous pouvez instancier un objet Service et effectuer cet appel, ou créer une source de données HTTP pour laquelle vous allez configurer une connexion (avec Connections :: add). La source de données HTTP contient une instance de Service qui vous permet d'appeler la méthode post() (ou send ('post', ...)). Voir https://github.com/UnionOfRAD/lithium/blob/master/data/source/Http.php#L24 –