# Autenticación con Open ID

## Introducción

El adaptador `Zend_Auth_Adapter_OpenId` se puede usar para autentificar usuarios usando un servidor remoto de OpenID. Este método de autenticación supone que el usuario sólo envia su OpenID a la aplicacion web, luego se redirecciona (envia) a su proveedor de OpenID para su verificacion mediante su contraseña o algún otro metodo. Esta contraseña no se le proporciona a la aplicacion web.

El OpenID solo es un URI que apunta a un sitio con información del usuari, así como información especiales que describe que servidor usar y que información (identidad) se debe enviar. Puedes leer más información acerca de OpenID en el sitio oficial de OpenId .

La clase `Zend_Auth_Adapter_OpenId` encapsula al componente `Zend_OpenId_Consumer` , el cual implementa el protocolo de autentificación OpenID.

`Zend_OpenId` aprovecha las GMP extension , cuando estén disponibles. Considere la posibilidad de usar GMP extension para un mejor rendimiento cuando use `Zend_Auth_Adapter_OpenId` .

## Características

Como es el caso de todos los adaptadores `Zend_Auth` , la clase `Zend_Auth_Adapter_OpenId` implementa `Zend_Auth_Adapter_Interface` , el cual define un metodo `authenticate()` . Este método realiza la autenticación en sí, pero el objeto debe estar configurado antes de ser llamado. La configuracion del adaptador requiere la creacion de un OpenID y otras opciones de `Zend_OpenId` específicos.

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. Así que el método `Zend_Auth_Adapter_OpenId::authenticate()` debe ser llamado dos veces. En la primera invocación del método no regresará nada, sino que redirige al usuario a su servidor de OpenID. Luego, después de que el usuario se autentica en el servidor remoto, este te regresará desde donde lo invocaste (a tu código) y deberás invocar a `Zend_Auth_Adapter_OpenId::authenticate()` de nuevo para verificar la firma que acompaña a la petición de re-direccionamiento 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 esperaba.

El siguiente ejemplo muestra el uso de `Zend_Auth_Adapter_OpenId` . Como se mencionó anteriormente, `Zend_Auth_Adapter_OpenId::autenticar()` debe ser llamada dos veces. La primera vez es cuando el usuario envía el formulario HTML con el `$_POST['openid_action']` en "Login" , y la segunda es posterior a la redirección HTTP del servidor OpenID con `$_GET['openid_mode']` o `$_POST['openid_mode']` .

    <?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. Por ejemplo, recibir la redirección del servidor de OpenID en una página aparte, especificando la "raíz" del sitio web y utilizar un `Zend_OpenId_Consumer_Storage` o un `Zend_Controller_Response` . Usted también puede utilizar el simple registro de extensiones para recuperar información sobre el usuario desde el servidor de OpenID. Todas estas posibilidades se describen con más detalle en el capítulo `Zend_OpenId_Consume` .