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'
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.