TigerZF
🌐Español

15.6. Autenticación Open ID

15.6.1. Introducción

El adaptador Zend_Auth_Adapter_OpenId se puede usar para autenticar usuarios utilizando servidores OpenID remotos. Este método de autenticación asume que el usuario envía únicamente su identidad OpenID a la aplicación web. Luego son redirigidos a su proveedor OpenID para demostrar la propiedad de la identidad usando una contraseña u otro método. Esta contraseña nunca se proporciona a la aplicación web.

La identidad OpenID es simplemente una URI que apunta a un sitio web con información sobre un usuario, junto con etiquetas especiales que describen qué servidor usar y qué identidad enviar allí. Puede leer más sobre OpenID en el sitio oficial de OpenID.

La clase Zend_Auth_Adapter_OpenId envuelve el componente Zend_OpenId_Consumer, que implementa el protocolo de autenticación OpenID en sí mismo.

[Note] Nota

Zend_OpenId aprovecha la extensión GMP, cuando está disponible. Considere habilitar la extensión GMP para obtener un mejor rendimiento al usar Zend_Auth_Adapter_OpenId.

15.6.2. Aspectos específicos

Como es el caso de todos los adaptadores de Zend_Auth, la clase Zend_Auth_Adapter_OpenId implementa Zend_Auth_Adapter_Interface, que define un método: authenticate(). Este método realiza la autenticación en sí misma, pero el objeto debe prepararse antes de invocarlo. Dicha preparación del adaptador incluye configurar la identidad OpenID y algunas otras opciones específicas de Zend_OpenId.

Sin embargo, a diferencia de otros adaptadores de Zend_Auth, Zend_Auth_Adapter_OpenId realiza la autenticación en un servidor externo en dos peticiones HTTP separadas. Por lo tanto, el método Zend_Auth_Adapter_OpenId::authenticate() debe llamarse dos veces. En la primera invocación, el método no retorna, sino que redirige al usuario a su servidor OpenID. Luego, después de que el usuario se autentica en el servidor remoto, será redirigido de vuelta y el script para esta segunda petición debe llamar de nuevo a Zend_Auth_Adapter_OpenId::authenticate() para verificar la firma que viene con la petición redirigida del servidor para completar el proceso de autenticación. En esta segunda invocación, el método devolverá el objeto Zend_Auth_Result como se espera.

El siguiente ejemplo muestra el uso de Zend_Auth_Adapter_OpenId. Como se mencionó anteriormente, el método Zend_Auth_Adapter_OpenId::authenticate() debe llamarse dos veces. La primera vez es después de que el usuario envía el formulario HTML con $_POST['openid_action'] establecido en "login", y la segunda vez es después de la redirección HTTP desde el servidor OpenID con $_GET['openid_mode'] o $_POST['openid_mode'] establecidos.

<?php
$status = "";
$auth = Zend_Auth::getInstance();
if ((isset($_POST['openid_action']) &&
     $_POST['openid_action'] == "login" &&
     !empty($_POST['openid_identifier'])) ||
    isset($_GET['openid_mode']) ||
    isset($_POST['openid_mode'])) {
    $result = $auth->authenticate(
        new Zend_Auth_Adapter_OpenId(@$_POST['openid_identifier']));
    if ($result->isValid()) {
        $status = "You are logged in as "
                . $auth->getIdentity()
                . "<br>\n";
    } else {
        $auth->clearIdentity();
        foreach ($result->getMessages() as $message) {
            $status .= "$message<br>\n";
        }
    }
} else if ($auth->hasIdentity()) {
    if (isset($_POST['openid_action']) &&
        $_POST['openid_action'] == "logout") {
        $auth->clearIdentity();
    } else {
        $status = "You are logged in as "
                . $auth->getIdentity()
                . "<br>\n";
    }
}
?>
<html><body>
<?php echo htmlspecialchars($status);?>
<form method="post"><fieldset>
<legend>OpenID Login</legend>
<input type="text" name="openid_identifier" value="">
<input type="submit" name="openid_action" value="login">
<input type="submit" name="openid_action" value="logout">
</fieldset></form></body></html>
*/

Puede personalizar el proceso de autenticación OpenID de varias formas. Puede, por ejemplo, recibir la redirección del servidor OpenID en una página separada, especificando la "raíz" del sitio web y usando un Zend_OpenId_Consumer_Storage personalizado o una Zend_Controller_Response personalizada. También puede usar la Simple Registration Extension para recuperar información sobre el usuario del servidor OpenID. Todas estas posibilidades se describen con más detalle en el capítulo de Zend_OpenId_Consumer.