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

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

        <para>
            <classname>Zend_Auth_Adapter_OpenId</classname> permet l'authentification à travers un
            serveur distant OpenID. Une telle authentification attend que l'utilisateur fournisse à
            l'application Web son identifiant OpenID. L'utilisateur est alors redirigé vers un
            fournisseur de services OpenID, afin de s'identifier en rapport avec l'application Web
            utilisée. Un mot de passe ou un autre procédé est utilisé, et celui-ci n'est jamais
            connu de l'application Web originale.
        </para>

        <para>
            L'identité OpenID est juste une <acronym>URI</acronym> qui pointe vers une page avec des
            informations décrivant le serveur à utiliser et des informations sur l'utilisateur.
            Pour plus d'informations, consultez
            <ulink url="http://www.openid.net/">le site officiel OpenID</ulink>.
        </para>

        <para>
            La classe <classname>Zend_Auth_Adapter_OpenId</classname> utilise
            <classname>Zend_OpenId_Consumer</classname> qui sert à gérer le protocole OpenID.
        </para>

        <note>
            <para>
                <classname>Zend_OpenId</classname> utilise
                <ulink url="http://www.php.net/manual/fr/ref.gmp.php">l'extension GMP</ulink>, si
                disponible. L'utilisation de l'extension <acronym>GMP</acronym> est recommandée pour
                améliorer les performances de <classname>Zend_Auth_Adapter_OpenId</classname>.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.auth.adapter.openid.specifics">
        <title>Spécifications</title>

        <para>
            Comme toute autre classe adaptateur de <classname>Zend_Auth</classname>,
            <classname>Zend_Auth_Adapter_OpenId</classname> implémente
            <classname>Zend_Auth_Adapter_Interface</classname>, qui définit une seule méthode :
            <methodname>authenticate()</methodname>. Elle est utilisée pour l'authentification
            elle-même, une fois que l'objet est prêt. La préparation d'un objet OpenID nécessite
            quelques options à passer à <classname>Zend_OpenId</classname>.
        </para>

        <para>
            A la différence des autres adaptateurs <classname>Zend_Auth</classname>, l'adaptateur
            <classname>Zend_Auth_Adapter_OpenId</classname> utilise une authentification sur un
            serveur externe à l'application, et nécessitera donc deux requêtes
            <acronym>HTTP</acronym>. Ainsi
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> devra être appelée
            deux fois&#160;: d'abord pour rediriger l'utilisateur vers le serveur OpenID (rien ne
            sera donc retourné par la méthode), qui lui-même redirigera l'utilisateur vers
            l'application, où un deuxième appel de méthode
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> vérifiera la signature
            et complétera le processus. Un objet <classname>Zend_Auth_Result</classname> sera alors
            cette fois-ci retourné.
        </para>

        <para>
            L'exemple suivant montre l'utilisation de
            <classname>Zend_Auth_Adapter_OpenId</classname>.
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> est appelée deux fois.
            La première fois juste après avoir envoyé le formulaire <acronym>HTML</acronym>, lorsque
            <varname>$_POST['openid_action']</varname> vaut <emphasis>"login"</emphasis>, et la
            deuxième fois après la redirection <acronym>HTTP</acronym> du serveur OpenID vers
            l'application, lorsque <varname>$_GET['openid_mode']</varname> ou
            <varname>$_POST['openid_mode']</varname> existe.
        </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>
            Il est possible de personnaliser le processus, pour par exemple demander une
            redirection du serveur OpenID vers l'application, sur une page différente de la
            première. Ceci peut être fait avec des objets personnalisés
            <classname>Zend_OpenId_Consumer_Storage</classname> ou
            <classname>Zend_Controller_Response</classname>. Vous pouvez aussi utiliser le procédé
            "Simple Registration" pour récupérer les informations au sujet de l'utilisateur, en
            provenance du serveur OpenID. Toutes ces possibilités sont écrites et détaillées dans
            le chapitre concernant <classname>Zend_OpenId_Consumer</classname>.
        </para>
    </sect2>
</sect1>
