<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 17175 -->
<!-- Reviewed: no -->
<sect1 id="zend.gdata.authsub">
    <title>Authentification par procédé AuthSub</title>

    <para>
        Le mécanisme d'authentification AuthSub permet d'écrire des applications dans
        lesquelles il n'est pas nécessaire de coder "en dur" des identifiants. L'application demande
        ces informations à l'utilisateur, pour ouvrir un session de travail.
    </para>

    <para>
        Voyez <ulink
        url="http://code.google.com/apis/accounts/AuthForWebApps.html">http://code.google.com/apis/accounts/AuthForWebApps.html</ulink>
        pour plus d'informations sur l'authentification AuthSub de Google Data.
    </para>

    <para>
        La documentation Google indique que le mécanisme ClientLogin est approprié dans le cas
        d'applications embarquées, à la différence du mécanisme AuthSub, utilisé pour les
        applications Web ayant recours à une authentification extérieure. AuthSub récupère des
        identifiant d'un utilisateur de l'application Web, et un navigateur réagissant aux
        redirections est requis. Le processus ClientLogin, lui, utilise du code <acronym>PHP</acronym> tel qu'écrit
        dans l'application elle-même. L'utilisateur de l'application n'entre pas en jeu pour fournir
        des identifiants de manière interactive.
    </para>

    <para>
        Les identifiants utilisés par le processus AuthSub sont fournis par l'utilisateur de
        l'application, et non par l'application elle-même.
    </para>

    <note>
        <title>Jetons sécurisés et certificats</title>

        <para>
            <classname>Zend_Gdata</classname> ne supporte pas actuellement l'utilisation de
            jetons sécurisés, car l'authentification AuthSub ne supporte pas les certificats
            permettant l'obtention de jetons sécurisés.
        </para>
    </note>

    <sect2 id="zend.gdata.authsub.login">
        <title>Création d'un client HTTP authentifié avec AuthSub</title>

        <para>
            Votre application <acronym>PHP</acronym> devrait fournir un lien <acronym>URL</acronym> vers le service
            d'authentification de Google. La méthode statique
            <methodname>Zend_Gdata_AuthSub::getAuthSubTokenUri()</methodname> permet ceci. Elle prend
            un argument représentant l'URL de votre application. De cette manière, le serveur Google
            pourra générer une réponse menant à une redirection vers cette <acronym>URL</acronym>, une fois
            l'authentification passée.
        </para>

        <para>
            Après que le serveur d'authentification de Google ait redirigé le navigateur de
            l'utilisateur vers votre application, un paramètre <constant>GET</constant> est ajouté, il
            s'agit du <code>jeton</code> d'authentification. Ce jeton servira à éviter de demander
            une authentification à chaque requête future.
        </para>

        <para>
            Ensuite, utilisez le jeton avec un appel à la méthode
            <methodname>Zend_Gdata_AuthSub::getHttpClient()</methodname>. Cette méthode retournera
            alors un objet de type <classname>Zend_Http_Client</classname>, qui sera peuplé des bons
            en-têtes permettant ainsi une utilisation future sans nécessité de
            ré-authentification.
        </para>

        <para>
            Ci-dessous un exemple d'une application <acronym>PHP</acronym> qui effectue une authentification afin
            d'utiliser le service Google Calendar. Elle crée un objet client
            <classname>Zend_Gdata</classname> utilisant le client <acronym>HTTP</acronym> fraîchement
            authentifié.
        </para>

        <programlisting language="php"><![CDATA[
$my_calendar =
    'http://www.google.com/calendar/feeds/default/private/full';

if (!isset($_SESSION['cal_token'])) {
    if (isset($_GET['token'])) {
        // Vous pouvez convertir le jeton unique en jeton de session.
        $session_token =
            Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
        // Enregistre le jeton de session, dans la session PHP.
        $_SESSION['cal_token'] = $session_token;
    } else {
        // Affiche le lien permettant la génération du jeton unique.
        $googleUri = Zend_Gdata_AuthSub::getAuthSubTokenUri(
            'http://'. $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'],
            $my_calendar, 0, 1);
        echo "Cliquez <a href='$googleUri'>ici</a>"
           . " pour autoriser votre application.";
        exit();
    }
}

// Création d'un client HTTP authentifié
// pour les échanges avec les serveurs Google.
$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['cal_token']);

// Création d'un objet Gdata utilisant le client HTTP authentifié :
$cal = new Zend_Gdata_Calendar($client);
]]></programlisting>
    </sect2>

    <sect2 id="zend.gdata.authsub.logout">
        <title>Destruction de l'authentification AuthSub</title>

        <para>
            Pour détruire la validité d'un jeton d'authentification, utilisez la méthode
            statique <methodname>Zend_Gdata_AuthSub::AuthSubRevokeToken()</methodname>. Autrement, le
            jeton reste valide un certain temps.
        </para>

        <programlisting language="php"><![CDATA[
// construction sécurisée de la valeur.
$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();
}
]]></programlisting>

        <note>
            <title>Notes de sécurité</title>

            <para>
                Le traitement effectué pour la variable <varname>$php_self</varname> dans l'exemple
                ci-dessus est une règle de sécurité générale, elle n'est pas spécifique à
                l'utilisation de <classname>Zend_Gdata</classname>. Vous devriez systématiquement
                filtrer le contenu que vous envoyez en tant qu'en-tête <acronym>HTTP</acronym>.
            </para>

            <para>
                Au sujet de la destruction du jeton, elle est recommandée lorsque
                l'utilisateur en a terminé avec sa session Google. Même si la possibilité
                d'interception de ce jeton reste très faible, il s'agit d'une précaution faisant
                partie du bon sens et des bonnes pratiques.
            </para>
        </note>
    </sect2>
</sect1>