Banner

Ultima revisión 08/04/2013

Autenticación con PHP Soap

Hoy me ha solicitado por email un ejemplo de cómo sería la autenticación en SOAP de PHP. Pues bien, ahí va.

Lo primero que debemos saber son las variables dónde se recogerán los valores del nombre de usuario y la contraseña enviadas. Estas son PHP_AUTH_USER y PHP_AUTH_PW y que están asociadas al array $_SERVER.

Por parte del Cliente manejaremos un array de opciones que contendrá varias de las configuraciones posibles. No serán todas necesarias pero esta bien conocerlas.

Por último necesitaremos una función MySQL que compruebe los valores enviados y la definición del SOAP Server.

Empezamos:

$options = array(
// Stuff for development.
'trace' => true,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'features' => SOAP_SINGLE_ELEMENT_ARRAYS +  SOAP_USE_XSI_ARRAY_TYPE,
'soap_version'   => SOAP_1_2,
'soap_action' => 'show',
// Auth credentials for the SOAP request.
'login' => "homer",
'password' =>"mosquis17",
//'Authorization' => 123456,
'language' => 'en',
'encoding'=>'UTF-8'

Opciones de configuración de SoapClient
Nombre Definición / Explicación
trace Activa el Debug.
exceptions Activa el control de excepciones de Soap que pueden ser manejadas por throw new SoapFault.
cache_wsdl Es una de estas: WSDL_CACHE_NONE, WSDL_CACHE_DISK, WSDL_CACHE_MEMORY o WSDL_CACHE_BOTH.
features Es un bitmask de SOAP_SINGLE_ELEMENT_ARRAYS, SOAP_USE_XSI_ARRAY_TYPE, SOAP_WAIT_ONE_WAY_CALLS. Sirve, por ejemplo, para decirle al SOAP que se van a manejar arrays.
keep-alive s un valor booleano que define si enviar la cabecera Connection: Keep-Alive o Connection: close
soap_action Es la acción o método del Web Service que queremos ejecutar. No es necesario establecerlo.
login Es el nombre de usario.
password Es la contraseña del usuario.
language Lenguaje en qué se establecerá la comunicación.
encoding El juego de caracteres en el que se hará la comunicación. UTF-8, ISO-8859-1, ...

$client = new SoapClient($pathServerl."soap.wsdl", $options );
try {
    // -----------------------------------------------------------------------------------
    // Aquí ponemos las funciones que queramos ejecutar como si no hubiese autenticación
    // ya que la autenticación ya se hace automáticamente con SoapClient.
    // -----------------------------------------------------------------------------------
} catch (SoapFault $exp) {
    echo "Message: ".$exp->faultstring."<br />";
    echo "Error Code: ".$exp->faultcode."<br />";
    echo "Line: ".$exp->getLine()."<br />";
    echo "Detail:<pre>".$exp->xdebug_message."</pre>";
    echo "Trace:<pre>".$exp->getTraceAsString()."</pre>";
}

En el fichero del Servidor, el del Web Service, ponemos un SoapServer corriente.

$soap_server  = new SoapServer("http://www.islavisual.com/soap.wsdl");
$soap_server->setClass("SOAP", $soap_server);
$soap_server->handle();

Por último, en la clase dónde tenemos la definición de los métodos insertamos el método de autenticación que podría ser similar al siguiente:

class SOAP {
    ...
    public function __construct(){
        $this->authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
    }

    /**
    * Function for authenticate users.
    * @param string $username The username.
    * @param string $password The user password.
    */

    public function authenticate($username, $password){
        // Clase para conectar con la Base de Datos
        $mysql = new mySQL();
        $mysql->connect();
    
        // Consultamos si el usuario existe.
        $acceso_concedido = $mysql->getValue("SELECT id FROM users WHERE `password` = '".$password."' AND `username` = '".$username.";");

        // Si el ID de usuario es 0 o es vacío entonces es que no tiene permiso.
        if($acceso_concedido == 0 || $acceso_concedido == ""){
            $user_bad = $mysql->getValue("SELECT id FROM `users` WHERE `username` = '".$username."';");
            $pass_bad = $mysql->getValue("SELECT id FROM `users` WHERE `password` = '".$password."';");

            if($user_bad == "" || $user_bad == 0) throw new SoapFault("Error ", 'El usuario no existe.');
            if($pass_bad == "" || $pass_bad == 0) throw new SoapFault("Error ", 'La contraseña es incorrecta.');
        }
    }
    ...
}

Si no se provoca alguna excepción todo estará correcto y la ejecución continuará. Por el contrario, terminará la ejecución y no se ejecutará ninguna instrucción más.