Archivo

Archivo para la categoría ‘PAPI’

phpPoA 2.4 disponible

miércoles, 13 de julio de 2011 Sin comentarios

Una nueva versión de la librería phpPoA, que permite conectar cualquier aplicación con el SIR (entre otras federaciones) está ya disponible en la forja. A grandes rasgos, estas son las novedades en esta versión:

  • Nuevo motor de autenticación basado en OpenID (gracias a Miguel Macías de la UPV).
  • Inclusión de algunos tutoriales básicos en la documentación del paquete.
  • Soporte de un nuevo atributo operacional en el motor de autenticación PAPI, para poder obtener la aserción completa emitida por el AS.
  • Soporte para la cabecera HTTP X-Forwarded-Port utilizada frecuentemente por proxies transparentes y balanceadores de tráfico. Esta opción es especialmente útil cuando la aplicación se encuentra detrás de un balanceador de tráfico que se encarga de servir los contenidos SSL en lugar del propio servidor web.
  • Varios bugfixes, fundamentalmente en el motor de autenticación PAPI y en el motor de autorización basado en URLs.
Categories: PAPI, SIR Tags: ,

Aplicación Cliente de OAuth2

martes, 16 de noviembre de 2010 Sin comentarios

Dentro de Sirope, el entorno de OAuth2 del SIR, hemos desarrollado un sistema basado en servicios web que permite acceder a los recursos ofrecidos por RedIRIS.

Actualmente los recursos que se pueden obtener son los relacionados con el estado de los proveedores de servicio: datos de monitorización, gráficos que representan el tráfico soportado por el mismo, etc.

En este post os vamos a comentar cómo desde tu organización conectarte a Sirope para obtener los recursos comentados anteriormente.

Paso 1: Instalación de la aplicación cliente:

El primer paso a realizar será bajar el paquete alojado en la forja de RedIRIS donde se encuentra el código y configuraciones básicas para instalar una aplicación cliente.

En este paquete encontraremos los siguientes elementos:

  • Directorio config donde se encuentra el archivo de configuración de la aplicación cliente, clientConfig.xml
  • Directorio src donde está el código que permite a la aplicación cliente obtener los recursos
  • Archivo index.php que contiene una prueba de concepto que permite ver el funcionamiento de la librería

Para poder ejecutar el archivo index.php de prueba, deberás alojarlo en un servidor con el único requisito de tener instalado PHP 5. El código de la librería (directorio src) puede alojarse en el directorio de librerías para PHP de tu sistema o en el mismo lugar donde esté el index.php.

Paso 2: Configuración de PAPI

Para poder realizar una petición a este servicio será necesario aportar una aserción de un usuario, por lo que es necesario tener un sistema de autenticación como un PHPPoA2 disponible en el sistema.

Para poder obtener una aserción mediante esta herramienta será necesario que en el archivo index.php se modifique lo siguente:

//Incluir el archivo PoA.php del PHPPoA2 instalado en tu sistema
include("PoA.php");
//Instanciar un Punto de Acceso
$poa = new PoA("miaplicacion");
//Autenticar al usuario
$auth = $poa->authenticate(); 
//Obtener una aserción que le represente 
if ($auth) { // usuario autenticado
   $userdata = $poa->getAttributes();
} else { 
   // ocurrió un error y el usuario no está autenticado
}

Paso 3: Primeras pruebas con index.php

Una vez configurado el punto de acceso adecuadamente, se deberá obtener al ejecutar el index.php el siguiente mensaje: . En el caso de que obtengas otro tipo de mensaje, asegúrate de haber configurado adecuadamente tu instalación de PAPI. Si sigues teniendo problemas, ponte en contacto con nosotros

Paso 4: Obtener nombre usuario y clave definitivos

Para poder acceder a los recursos anteriormente descritos será necesario tener un nombre de usuario y clave dada por nosotros, para ello ponte en contacto con nosotros, comentándonos a qué institución perteneces.

Paso 5: Acceso a recursos

En el código de tu aplicación, deberás crear un objeto OAuth.

$client = new OAuth($dir);


Donde $dir será la ruta absoluta al directorio donde está localizado el archivo de configuración clientConfig.xml. Por ejemplo:

$client = new OAuth(dirname(__FILE__)."/own_config/");


Nota: La ruta que tiene el sistema puesta por defecto es la carpeta ‘config’ que podemos encontrar en el código descargado.

Una vez creado indicaremos el scope o recurso al que queremos acceder de los que tenemos disponibles:

  • OAUTH_STATUS_SCOPE: con este scope es posible obtener información de monitorización de un proveedor de identidad concreto (rendimiento, último estado estable, etc.). Para ello será necesario enviar junto al url del scope el sHO del usuario que está accediendo al sistema. Solo podrán ver la información relativa a su proveedor de identidad las personas que pertenezcan a la misma institución del mismo. Para indicar un recurso tendremos que hacer la siguiente llamada:

    $client->setScope(OAUTH_STATUS_SCOPE."?sho=".$sHO);


    El resultado de esta petición será un objeto json, mediante la cual se representa un array con atributos asociados al proveedor de servicio sobre el que se realiza la petición.

  • OAUTH_GRAPHS_SCOPE: este scope permite obtener los gráficos correspondientes al tráfico de un proveedor de servicio. Para poder acceder a esta gráfica será necesario establecer un scope tal y como el que podemos ver en el ejemplo:

    $client->setScope(OAUTH_GRAPHS_SCOPE."?sho=".$sHO."&period=".$period."
    &idp=".$idp."&geom=".$geom);


    Donde:

    • $sHO es el schacHomeOrganization del usuario que entra en la aplicación
    • $period será una cadena con cualquiera de los valores ‘dayly’, ‘weekly’, ‘monthly’ o ‘yearly’
    • $idp será el identificador del idp de la organización en cuestión, por ejemplo «AESIR»
    • $geom será el tamaño de la gráfica, con formato anchura x altura, por ejemplo: «650×150»

    El resultado de esta petición será un objeto json, mediante la cual se representará un array con campo ‘data’ que a su vez tienen dos elementos: ‘mime’, que tendrá el tipo mime de la imagen y ‘image’, donde estará la imagen representada en caracteres. Para mostrar esta imagen, será necesario realizar lo siguiente en el código de la aplicación que esté desarrollándose:

    $result = json_decode($content, true);
    $image = $result['data']['image'];
    header("Content-Type: ".$result['data']['mime']);
    echo base64_decode($image);

  • OAUTH_CHARTS_SCOPE: este scope permite obtener las tablas numéricas correspondientes al tráfico de un proveedor de servicio. Para poder acceder a esta tabla será necesario establecer un scope tal y como el que podemos ver en el ejemplo:

    $client->setScope(OAUTH_CHARTS_SCOPE."?sho=".$sHO."&period=".$period."
    &idp=".$idp."&geom=".$geom);


    Donde:

    • $sHO es el schacHomeOrganization del usuario que entra en la aplicación
    • $period será una cadena con cualquiera de los valores ‘dayly’, ‘weekly’, ‘monthly’ o ‘yearly’
    • $idp será el identificador del idp de la organización en cuestión, por ejemplo «AESIR»
    • $geom será el tamaño de la gráfica, con formato anchura x altura, por ejemplo: «650×150»

    La respuesta que se recibe de este servicio es un objeto json que representa un array con la siguiente estructura:

    • Array[data] = Array(
      • ‘date’: fecha relacionada con la información obtenida
      • ‘series’: array con
        • ‘type’: tipo del gráfico, por ejemplo: «pie»
        • ‘name’: nombre del IdP asociado a la información
        • ‘series’: array con las etiquetas y datos numéricos asociados a una representación gráfica del tipo indicado en ‘type’
  • Por último, para obtener el recurso se realiza la llamada a la función doOAuthFlow($assertion), pasándole la aserción en forma de cadena. Por ejemplo, para una instalación de PHPPoA se realizaría lo siguiente:

    $res = $client->doOAuthFlow($userdata['PAPIAssertion']);
    if (!$res) {   
       echo $client->getResource();
    }


    Donde $client->getResource(); obtendrá el recurso en cuestión, el cual será un objeto json con el formato indicado anteriormente para cada scope.

Categories: Monitorización, PAPI, SIR Tags:

Atributos operacionales en PAPI/SIR con el phpPoA2

viernes, 30 de julio de 2010 Sin comentarios

No hace mucho tiempo, en el equipo del SIR estuvimos hablando sobre la posibilidad de incluir atributos en la aserción que no fuesen estrictamente atributos del usuario, sino atributos relativos al protocolo o incluso a la operación concreta de la federación, como por ejemplo, un atributo que indique si el usuario ha expresado ya su consentimiento para entregar el resto de atributos a un PoA PAPI. Esto es lo que dimos en llamar «atributos operacionales«.

Pues bien, desde ayer tenemos en el phpPoA2 una primera implementación que da soporte a este tipo de atributos. La idea es que como la reimplementación del PoA en PHP soporta espacios de nombres en los atributos, dependiendo del espacio de nombres se puede pedir al PoA que entregue un atributo operacional en lugar de un atributo del usuario. De momento, y a falta de confirmación, existen dos espacios de nombres autoexplicativos:

urn:mace:rediris.es:papi:protocol
urn:mace:rediris.es:papi:attributes

De esta forma, se le puede solicitar un atributo operacional al phpPoA2 con el método getAttribute(), indicando el nombre del atributo y el espacio de nombres del protocolo (codificado con la constante NS_PAPI_PROTOCOL). De momento he diferenciado los atributos operacionales con un prefijo «_papi_» delante del nombre del atributo, pero esto puede cambiar. Para pedir el atributo no es necesario incluir el prefijo.

Así mismo, se han incluido otra serie de parámetros dentro del espacio de nombres de atributos operacionales. Son los siguientes:

PROTO_ATTR_AS_ID: el identificador del AS que ha autenticado al usuario. Se corresponde con el tradicional «@xxxxx» que cierra una aserción PAPI.
PROTO_ATTR_KEY: el identificador de la transacción PAPI por la cual se autentica al usuario.
PROTO_ATTR_EXPIRE_TIME: el tiempo unix en el que caduca la autenticación para el usuario actual.

A modo de ejemplo, obtener el identificador del AS que autenticó al usuario, es tan sencillo como:

$poa = new PoA("app");
$poa->authenticate();
$id = $poa->getAttribute(PROTO_ATTR_AS_ID, NS_PAPI_PROTOCOL);
Categories: PAPI, SIR Tags: ,

mod_perl en el Apache de MacOSX

martes, 15 de junio de 2010 2 comentarios

He estado varios dias tratando de poder arrancar un despliegue de PAPI similar al que tenemos en el GPoA SIR en mi Mac con el objetivo de poder depurar nuevas caracteristicas del protocolo (del que ya haremos un post mas adelante). La cuestion era que no habia manera de que el mod_perl que viene con el sistema fuera capaz de arrancar dentro del Apache2 que tambien forma parte del MacOSX estandar.

Al final he encontrado que el bundle de Apache2 contiene un ejecutable de 64 bits:

file /usr/sbin/httpd
/usr/sbin/httpd: Mach-O universal binary with 4 architectures
/usr/sbin/httpd (for architecture ppc7400):	Mach-O executable ppc
/usr/sbin/httpd (for architecture ppc64):	Mach-O 64-bit executable ppc64
/usr/sbin/httpd (for architecture i386):	Mach-O executable i386
/usr/sbin/httpd (for architecture x86_64):	Mach-O 64-bit executable x86_64

Mientras que el bundle de Perl solo contiene un ejecutable de 32 bits:

file /usr/bin/perl
/usr/bin/perl: Mach-O universal binary with 2 architectures
/usr/bin/perl (for architecture ppc7400):	Mach-O executable ppc
/usr/bin/perl (for architecture i386):	Mach-O executable i386

Para que el Apache2 pueda ejecutar modulos Perl es necesario arrancarlo en modo 32 bits:

sudo arch -arch i386 /usr/sbin/httpd

Y para que el Apache2 arranque en modo 32 bits desde el panel de las Preferencias del Sistema hay que modificar /System/Library/LaunchDaemons/org.apache.httpd.plist para que tenga este aspecto:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>org.apache.httpd</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/arch</string>
<string>-arch</string>
<string>i386</string>
<string>/usr/sbin/httpd</string>
<string>-D</string>
<string>FOREGROUND</string>
</array>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
</dict>
</plist>
Categories: PAPI Tags:

Autenticación básica con el phpPoA2

martes, 11 de mayo de 2010 1 comentario

Hoy os vamos a enseñar a federar de la forma más sencilla posible vuestras aplicaciones con el nuevo phpPoA2. Lo primero que debéis hacer es descargaros la última versión desde la forja de RedIRIS, descomprimirlo en vuestro servidor y aseguraros de que vuestros scripts en PHP pueden acceder a él. En primer lugar, debéis configurar el PoA. La librería está diseñada de forma que un único fichero de configuración sea suficiente para configurar el PoA múltiples aplicaciones, así que debéis incluir una sección general en vuestro fichero PoA.conf:

$poa_cfg = array(
'LogFile' => '/var/log/poa.log',
'Debug' => false,
'LogLevel' => E_USER_ERROR,
'Language' => 'es_ES',
'NoAuthErrorURL' => 'http://www.miweb.es/error.php?status=403',
'SystemErrorURL' => 'http://www.miweb.es/error.php?status=503',
'InviteErrorURL' => 'http://www.miweb.es/null/error.php?status=503',
'AuthnEngine' => 'PAPIAuthnEngine',
);


Si esta configuración por defecto no es suficiente para vuestra aplicación o queréis modificar algún parámetro, basta con que los cambiéis en una sección específica para vuestra aplicación, que en caso contrario será igual que la general:

$poa_cfg['miaplicacion'] = $poa_cfg;

Una vez configurado el PoA en cuanto a sus opciones más básicas, debemos configurar la autenticación. El phpPoA, por su arquitectura modular, soporta distintos protocolos tanto de autenticación como de autorización, y viene con algunos por defecto. Con la distribución por defecto, la autorización se realizará mediante el motor de autenticación PAPI, y la podréis configurar en el fichero PAPI.conf:

$papi_cfg = array(
'Location'            => dirname($_SERVER['SCRIPT_NAME']),
'CookieDomain'        => $_SERVER['SERVER_NAME'],
'CookieTimeout'       => 3600,
'LKey'                => 'examplekey',
'PubKeyFile'          => 'pubkey.pem',
'DBType'              => PAPI_DBA,
'DBFile'              => '/var/spool/db/requests.db4',
'RedirectURL'         => 'http://www.rediris.es/SIRGPoA/papiPoA',
'RedirectType'        => GPOA_T
);

Al igual que en la configuración general del PoA, ésta es una configuración por defecto que podréis adaptar a las necesidades de vuestra aplicación, simplemente sobreescribiendo los parámetros por defecto que necesitéis. Recordad que siempre debéis definir una sección correspondiente a vuestra aplicación o el phpPoA se quejará de un error de configuración.

$papi_cfg['miaplicacion'] = array(
'CookieTimeout'       => 1800,
'Location'            => '/miaplicacion'
);

Y ya sólo queda lo más fácil, usarlo desde vuestra propia aplicación:

include("PoA.php");
$poa = new PoA("miaplicacion");
$auth = $poa->authenticate();
 
if ($auth) { // usuario autenticado
 
} else { // ocurrió un error y el usuario no está autenticado
 
}

Fácil, ¿verdad?

Categories: PAPI Tags: ,