TigerZF
🌐Español

37.3. Autenticación con AuthSub

El mecanismo AuthSub le permite escribir aplicaciones web que obtienen acceso autenticado a los servicios de Google Data, sin tener que escribir código que gestione las credenciales del usuario.

Consulte http://code.google.com/apis/accounts/AuthForWebApps.html para más información sobre la autenticación AuthSub de Google Data.

La documentación de Google indica que el mecanismo ClientLogin es apropiado para "aplicaciones instaladas", mientras que el mecanismo AuthSub es para "aplicaciones web". La diferencia es que AuthSub requiere interacción del usuario y una interfaz de navegador que pueda reaccionar a las solicitudes de redirección. La solución ClientLogin usa código PHP para proporcionar las credenciales de la cuenta; no se requiere que el usuario introduzca sus credenciales de forma interactiva.

Las credenciales de la cuenta proporcionadas mediante el mecanismo AuthSub son introducidas por el usuario de la aplicación web. Por lo tanto, deben ser credenciales de cuenta conocidas por ese usuario.

[Note] Aplicaciones registradas

Zend_Gdata actualmente no soporta el uso de tokens seguros, porque la autenticación AuthSub no admite el envío de un certificado digital para obtener un token seguro.

37.3.1. Creación de un cliente Http autenticado con AuthSub

Su aplicación PHP debe proporcionar un hiperenlace a la URL de Google que realiza la autenticación. La función estática Zend_Gdata_AuthSub::getAuthSubTokenUri() proporciona la URL correcta. Los argumentos de esta función incluyen la URL de su aplicación PHP para que Google pueda redirigir el navegador del usuario de vuelta a su aplicación después de que las credenciales del usuario hayan sido verificadas.

Después de que el servidor de autenticación de Google redirige el navegador del usuario de vuelta a la aplicación actual, se establece un parámetro de solicitud GET, llamado token. El valor de este parámetro es un token de un solo uso que puede usarse para acceso autenticado. Este token puede convertirse en un token multiuso y almacenarse en su sesión.

Luego use el valor del token en una llamada a Zend_Gdata_AuthSub::getHttpClient(). Esta función devuelve una instancia de Zend_Http_Client, con las cabeceras apropiadas establecidas para que las solicitudes posteriores que su aplicación envíe usando ese Cliente HTTP también estén autenticadas.

A continuación se muestra un ejemplo de código PHP para que una aplicación web obtenga autenticación para usar el servicio Google Calendar y cree un objeto cliente Zend_Gdata usando ese Cliente HTTP autenticado.

$my_calendar = 'http://www.google.com/calendar/feeds/default/private/full';

if (!isset($_SESSION['cal_token'])) {
    if (isset($_GET['token'])) {
        // You can convert the single-use token to a session token.
        $session_token =
            Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
        // Store the session token in our session.
        $_SESSION['cal_token'] = $session_token;
    } else {
        // Display link to generate single-use token
        $googleUri = Zend_Gdata_AuthSub::getAuthSubTokenUri(
            'http://'. $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'],
            $my_calendar, 0, 1);
        echo "Click <a href='$googleUri'>here</a> " .
             "to authorize this application.";
        exit();
    }
}

// Create an authenticated HTTP Client to talk to Google.
$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['cal_token']);

// Create a Gdata object using the authenticated Http Client
$cal = new Zend_Gdata_Calendar($client);

37.3.2. Revocación de la autenticación AuthSub

Para terminar el estado autenticado de un token dado, use la función estática Zend_Gdata_AuthSub::AuthSubRevokeToken(). De lo contrario, el token seguirá siendo válido durante algún tiempo.

// Carefully construct this value to avoid application security problems.
$php_self = htmlentities(substr($_SERVER['PHP_SELF'],
                         0,
                         strcspn($_SERVER['PHP_SELF'], "\n\r")),
                         ENT_QUOTES);

if (isset($_GET['logout'])) {
    Zend_Gdata_AuthSub::AuthSubRevokeToken($_SESSION['cal_token']);
    unset($_SESSION['cal_token']);
    header('Location: ' . $php_self);
    exit();
}
[Note] Notas de seguridad

El tratamiento de la variable $php_self en el ejemplo anterior es una directriz general de seguridad, no es específica de Zend_Gdata. Siempre debe filtrar el contenido que envía a las cabeceras HTTP.

En cuanto a la revocación de tokens de autenticación, se recomienda hacerlo cuando el usuario haya terminado su sesión de Google Data. La posibilidad de que alguien pueda interceptar el token y usarlo para fines maliciosos es muy pequeña, pero de todas formas es una buena práctica terminar el acceso autenticado a cualquier servicio.