Servicio de Informática y Comunicaciones - Universidad de SevillaUniversidad de SevillaSIC

HTML5

CSS3

phpCAS

Integración con SSO

Integración mediante CAS usando phpCAS

 

El uso del software phpCAS permite la integración de aplicaciones PHP en el SSO usando el protocolo CAS.

Los requerimientos están indicados en el siguiente enlace: phpCAS requirements

No es necesario que esté publicada de cara a Internet por el servidor web.

Descargaremos la última versión de phpCAS, y la descomprimiremos.

Siendo el fichero CAS-X.Y.Z.tgz el que hemos descargado, lo descomprimiremos:

# cd /var/www
# tar xzf CAS-X.Y.Z.tgz

La biblioteca incluye varios ejemplos en el subdirectorio docs/examples/, pero a continuación se describirá una integración sencilla.

Validación de certificados

Una parte muy importante de la integración con el SSO es asegurarnos de que la aplicación está hablando con el SSO de la Universidad de Sevilla. Esto se consigue mediante la validación del certificado del servicio HTTPS que presenta.

Si no hacemos esta comprobación en cada conexión, un atacante malicioso podría suplantar al sistema SSO y engañar a nuestra aplicación, con todos los riesgos que ello conlleva.

La validación del certificado presentado por el servicio SSO se basa en la comprobación de la autoridad de certificación (CA) que firma el certificado y en la validación del campo CN del mismo. La CA que emite los certificados del servicio SSO es TERENA SSL CA 2; en el siguiente enlace se puede descargar la cadena de certificación, que tendremos que copiar en el servidor: complete_chain_us_es.pem (usar Guardar enlace como para descargarlo).

Por último, para que esta validación funcione, hemos de comprobar que hay conectividad entre nuestro servidor PHP y el servidor SSO, usando como protocolo seguro al menos TLS 1.2, ya que las versiones más obsoletas a partir de ésta no están soportadas por el servidor SSO.

Puesta en marcha de la biblioteca

La biblioteca phpCAS necesita la siguiente secuencia de instrucciones para su puesta en marcha:


require_once '/ruta/a/CAS-X.Y.Z/CAS.php';

// Genera un log en /tmp/phpCAS.log. Se recomienda desactivarlo en producción
\phpCAS::setDebug();

// Muestra errores al usuario. Se recomienda desactivarlo en producción
\phpCAS::setVerbose(true);

// Instancia el cliente
$host_sso = 'ssopre.us.es';
$port_sso = 443;
$path_sso = '/CAS';

\phpCAS::client(CAS_VERSION_2_0, $host_sso, $port_sso, $path_sso);

// Habilita la validación del certificado y de su CN
\phpCAS::setCasServerCACert('/ruta/a/complete_chain_us_es.pem', true);

Este código es común a cualquier integración con phpCAS, y deberá ser ejecutado cuando sea necesaria la interacción con el servicio SSO. En los ejemplos mostrados a continuación se omitirá este conjunto de instrucciones.

Autenticación

La autenticación se consigue mediante el método forceAuthentication():


\phpCAS::forceAuthentication();

El método se encarga de redirigir al servicio SSO al usuario si no está actualmente autenticado, y detiene la ejecución tras hacerlo. Si el usuario ya estuviera autenticado, el script sigue ejecutándose.

Lectura de un atributo

Se usa el método getAttribute(). Si un atributo no existe o no tiene valor, devuelve null. Si tiene más de un valor, devolverá un array con todos los valores, y si solamente tuviera uno, devolverá una cadena con el valor. A continuación se muestra una posible solución al manejo de todos los casos:


// El nombre del atributo se especifica en minúsculas
$relaciones = \phpCAS::getAttribute('usesrelacion');

if ($relaciones === null) {
    // No debería suceder con UsEsRelacion, pero se muestra el caso
    echo "El usuario no tiene ninguna relación";
} else {
    if (is_array($relaciones)) {
        echo "Tiene varias relaciones: ";
        echo join(', ', $relaciones);
    } else {
        echo "Tiene una sola relación: " . $relaciones;
    }
}

Cierre de sesión

Para cerrar la sesión en el SSO, se usará el método logout(). Es muy recomendable pasar una referencia a la URL a la que queremos que el SSO redirija al usuario tras cerrar su sesión, ya que de lo contrario volverá a la URL actual.

La URL de vuelta debe pertenecer a la aplicación, y se recomienda que no exija autenticación y que simplemente muestre un mensaje como "Se ha cerrado correctamente su sesión" o similar.


\phpCAS::logout(array(
    'url' => 'https://miaplicacion.us.es/url/de/vuelta/tras/logout',
));