jueves, 5 de enero de 2017

Como leer/ recibir (Autenticar) el encabezado del lado del servidor en php web-services soap wsdl nusoap (nusoap authentication header on server side)



Buenas tardes el dia de hoy  estuve  navegando por mi pagina favorita  http://stackoverflow.com y me di cuenta que varios compañeros del mundo de la programación se preguntaban lo siguiente:
how to get the header on server side. php web-services soap wsdl nusoap?

Como leer/ recibir (Autenticar) el encabezado del lado del servidor en php  web-services soap wsdl nusoap (nusoap authentication header on server side), así que decidí elaborar este  código para apoyarlos, ojo este es un código bastante sencillo lo elabore en un descanso del trabajo si tienen alguna observación  o recomendación es bien recibida. Bueno como dice mi profesor manos al código.


Primero vamos a Trabaja con SoapUi para consumir el servicio tal como lo muestra la imagen:

  


Segundo vamos a elaborar el código a nivel de server con NUSOAP tal como lo muestro a continuación:


<?php
require_once "lib/nusoap.php";
function Consulta ($Id)
     {    
       $usuario="";
       $password="";
       
        global $server;
   
     $requestHeaders = $server->requestHeader;
     
   
   
         // aqui capturamos los headers y extraemos el username y el password cuando invocamos desde el aplicativo SOAPUI
         $headers = apache_request_headers();
         foreach($headers as $key=>$value) {    if ($key=='username'){ $usuario=$value;}    if ($key=='password'){ $password=$value;} }

       
        // aqui capturamos los headers y extraemos el username y el password cuando invocamos desde el CLIENTE NUSOAP OJO
        if($usuario=="" and $password=="")
           {
                          foreach($requestHeaders as $row => $innerArray)
                          {
                             foreach($innerArray as $key => $value)
                              {
                                 if ($key=='username'){ $usuario=$value;}   
                                 if ($key=='password'){ $password=$value;}
                               }
                          }
           }// cierra el if de $usuario=="" and $password==""
       
       

            
    try {
                        
           //Aqui busco en la tabla de usuarios si existe el usuario y el password
    
                $dbh1 = new PDO('pgsql:host=127.0.0.1;port=5432;dbname=Bd_Circulares;user=postgres;password=123');
                   $sql="Select COUNT(*) as total from usuarios a where a.usuario ="."'".trim($usuario)."'".' and a.clave='."'".trim($password)."'";
                $count = $dbh1->query($sql)->fetchColumn();   
                if( $count >0 )
                {

                   
//Aqui me conecto a Oracle para buscar los datos del id que estoy buscando

                        $c=0;
                        $dbh = new PDO('oci:dbname=10.227.158.69:1521/FCVZP2', 'root', '123');
                        $sql="Select a.CUSTOMER_NAME1,a.ADDRESS_LINE1,a.COUNTRY,a.NATIONALITY from fcuv11.sttm_customer a where a.unique_id_value ="."'".$Id."'" ;
                        $sth = $dbh -> prepare($sql);
                        $sth -> execute();
               
                        foreach ($sth as $row)
                               {
                    
                                 $result[$c] = array("mensaje" => "Busqueda Exitosa","nombre" => $row['CUSTOMER_NAME1'],"direccion" => $row['ADDRESS_LINE1'],"pais"=> $row['COUNTRY'],"nacionalidad"=> $row['NATIONALITY']);
                                  $c++;
                               }// cierra el foreach
               
             
                               if ($c==0)
                                      {
                                       $result[$c] = array("mensaje" => "No se encontraron datos");
                                      } // cieer el if
       
                }else{
                   
                                     $result[0] = array("mensaje" => "Fallo la validacion de username/password");
                   
                }  // cierra el if  $count >0
        } // cierra el try

          catch (PDOException $e)
          {
            return "Error al conectar base de datos"; exit();
          }
   
      $dbh= null;
      $dbh1= null;
      return $result;
   
    }// CIERRA metodo



   
   
   
    $server = new soap_server();
    $server->configureWSDL('Servidor', 'urn:Servidor');
   
   
    $server->wsdl->addComplexType(
    'dataArray',
    'complexType',
    'array',
    '',
    'SOAP-ENC:Array',
    array(
    'mensaje' => array('mensaje' => 'mensaje', 'type' => 'xsd:string'),
    'nombre' => array('nombre' => 'nombre', 'type' => 'xsd:string'),
    'direccion' => array('direccion' => 'direccion', 'type' => 'xsd:string'),
    'pais' => array('pais' => 'pais', 'type' => 'xsd:string'),
    'nacionalidad' => array('nacionalidad' => 'nacionalidad', 'type' => 'xsd:string'),
    array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:return_array_php[]')), 'tns:return_array_php'
    ));
   
   
   
   
   
$server->register(
    'Consulta',    
    array('param_id'=>'xsd:string'),
    array('return'=>'tns:dataArray'),
    $namespace,
    false,
    'rpc',
    'encoded',
    'description'
);

$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
$server->service($POST_DATA);
?>




Veamos el resultado si el dato es  encontrado en la base de datos con el usuario y password correctos:






Veamos qué pasa si se envía un usuario o password incorrecto:



 


Ahora veamos como seria el cliente NUSOAP PHP:



<?php
include('lib/nusoap.php');
$session_header = "<UserCredentials xmlns='http://vidzapper.net/Webservice/'><username>root</username><password>xxx</password></UserCredentials>";
$client = new nusoap_client('http://10.227.158.58/ws/Servidor.php?wsdl','wsdl');
$client->soap_defencoding = 'utf-8';
$client->setHeaders($session_header);
$err = $client->getError();
if ($err) {    echo 'Error en Constructor' . $err ; }   
$param = array('param_id' => '12331096');
$result = $client->call('Consulta', $param);
       
        if ($client->fault)
          {
             echo 'Fallo';
             print_r($result);
          } else {    // Chequea errores
               $err = $client->getError();
          if ($err) {        // Muestra el error
                 echo 'Error->' . $err ;
                    } else {        // Muestra el resultado
                     echo 'Resultado';
                     print_r ($result);
                   }
        }
 ?>









No hay comentarios:

Publicar un comentario