<?xml version="1.0" encoding="UTF-8"?>
    <!-- EN-Revision: 24249 -->
    <!-- Reviewed: no -->
<sect1 id="zend.auth.adapter.openid">

    <title>Autenticación con Open ID </title>

    <sect2 id="zend.auth.adapter.openid.introduction">

        <title>Introducción</title>
        <para>
            El adaptador
            <classname>Zend_Auth_Adapter_OpenId</classname>
            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.
        </para>
        <para>
            El OpenID solo es un
            <acronym>URI</acronym>
            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
            <ulink url="http://www.openid.net/">sitio oficial de
                OpenId</ulink>
            .
        </para>
        <para>
            La clase
            <classname>Zend_Auth_Adapter_OpenId</classname>
            encapsula
            al componente
            <classname>Zend_OpenId_Consumer</classname>
            , el cual
            implementa el protocolo de autentificación OpenID.
        </para>

        <note>
            <para>
                <classname>Zend_OpenId</classname>
                aprovecha las
                <ulink url="http://php.net/gmp">GMP extension</ulink>
                , cuando estén
                disponibles. Considere la posibilidad de usar
                <acronym>GMP</acronym>
                extension para un mejor rendimiento
                cuando use
                <classname>Zend_Auth_Adapter_OpenId</classname>
                .
            </para>
        </note>
    </sect2>

    <sect2 id="zend.auth.adapter.openid.specifics">
        <title>Características</title>
        <para>
            Como es el caso de todos los adaptadores
            <classname>Zend_Auth</classname>
            , la clase
            <classname>Zend_Auth_Adapter_OpenId</classname>
            implementa
            <classname>Zend_Auth_Adapter_Interface</classname>
            , el cual
            define un metodo
            <methodname>authenticate()</methodname>
            . 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
            <classname>Zend_OpenId</classname>
            específicos.
        </para>
        <para>
            Sin embargo, a diferencia de otros adaptadores de
            <classname>Zend_Auth</classname>
            ,
            <classname>Zend_Auth_Adapter_OpenId</classname>
            realiza la
            autenticación en un servidor externo en dos peticiones
            <acronym>HTTP</acronym>
            separadas. Así que el método
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
            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
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
            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
            <classname>Zend_Auth_Result</classname>
            como se
            esperaba.
        </para>

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

        <programlisting language="php"><![CDATA[
<?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>

]]></programlisting>
        <para>
            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
            <classname>Zend_OpenId_Consumer_Storage</classname>
            o un
            <classname>Zend_Controller_Response</classname>
            . 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
            <classname>Zend_OpenId_Consume</classname>
            .
        </para>

    </sect2>
</sect1>
