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

    <sect2 id="zend.auth.adapter.openid.introduction">
        <title>Einführung</title>

        <para>
            Der <classname>Zend_Auth_Adapter_OpenId</classname> Adapter kann verwendet werden um
            Benutzer durch Verwendung eines entfernten OpenID Servers zu authentifizieren. Diese
            Authentifizierungsmethode nimmt an das Benutzer nur ihre OpenID Identität an die Web
            Anwendung übermitteln. Dann werden Sie zu Ihrem OpenID Anbieter umgeleitet um die
            Eigentümerschaft der Identität mit Hilfe eines Passwortes oder einer anderen Methode zu
            prüfen. Dieses Passwort wird der Web Anwendung nie bekannt gegeben.
        </para>

        <para>
            Die OpenID Identität ist nur eine <acronym>URL</acronym> die auf eine Webseite mit
            entsprechenden Informationen über den Benutzer und spezielle Tags verweist welche
            beschreiben welcher Server verwendet werden soll und welche Identität dort zu
            übermitteln ist. Mehr über OpenID kann auf der
            <ulink url="http://www.openid.net/">offiziellen OpenID Site</ulink> nachgelesen werden.
        </para>

        <para>
            Die <classname>Zend_Auth_Adapter_OpenId</classname> Klasse umgibt die
            <classname>Zend_OpenId_Consumer</classname> Komponente welche das OpenID
            Authentifizierungs Protokoll selbst implementiert.
        </para>

        <note>
            <para>
                <classname>Zend_OpenId</classname> hat Vorteile davon wenn die
                <ulink url="http://php.net/gmp">GMP Erweiterung</ulink> vorhanden ist. Es sollte
                Angedacht werden die <acronym>GMP</acronym> Erweiterung für eine bessere
                Performance einzuschalten wenn <classname>Zend_Auth_Adapter_OpenId</classname>
                verwendet wird.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.auth.adapter.openid.specifics">
        <title>Spezielles</title>

        <para>
            Wie in diesem Fall für alle <classname>Zend_Auth</classname> Adapter, implementiert die
            <classname>Zend_Auth_Adapter_OpenId</classname> Klasse das
            <classname>Zend_Auth_Adapter_Interface</classname>, welches nur eine Methode definiert:
            <methodname>authenticate()</methodname>. Diese Methode führt die Authentifizierung
            selbst durch, allerdings muß das Objekt vor dem Aufruf vorbereitet werden. So eine
            Vorbereitung des Adapters beinhaltet das Setzen der OpenID Identität und einige andere
            <classname>Zend_OpenId</classname> spezifische Optionen.
        </para>

        <para>
            Trotzdem, im Gegensatz zu anderen <classname>Zend_Auth</classname> Adaptern führt
            <classname>Zend_Auth_Adapter_OpenId</classname> Authentifizierungen an einem externen
            Server durch und das wird in zwei separaten <acronym>HTTP</acronym> Anfragen getan.
            Deswegen muß <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> zweimal
            aufgerufen werden. Beim ersten Aufruf wird die Methode nichts zurückgeben, aber den
            Benutzer zu seinem OpenID Server umleiten. Dann, nachdem der Benutzer auf dem
            entfernten Server authentifiziert ist wird dieser wieder zurück umleiten und das Skript
            muß für diese zweite Anfrage
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> nochmals aufrufen um
            die Signatur zu prüfen, welche mit der umgeleiteten Anfrage vom Server geschickt wird,
            und den Authentifikationsprozess zu beenden. Bei diesem zweiten Aufruf wird wie
            erwartet ein <classname>Zend_Auth_Result</classname> Objekt zurückgegeben.
        </para>

        <para>
            Das folgende Beispiel zeigt die Verwendung von
            <classname>Zend_Auth_Adapter_OpenId</classname>. Wie vorher erwähnt wird die
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> Methode zweimal
            aufgerufen. Das erste Mal, ist nachdem der Benutzer das <acronym>HTML</acronym>
            Formular übermittelt hat und <varname>$_POST['openid_action']</varname> auf
            <emphasis>"login"</emphasis> gesetzt wurde, und das zweite Mal nach der
            <acronym>HTTP</acronym> Umleitung vom OpenID Server wenn
            <varname>$_GET['openid_mode']</varname> oder
            <varname>$_POST['openid_mode']</varname> gesetzt wurde.
        </para>

        <programlisting language="php"><![CDATA[
$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 = "Sie sind angemeldet als "
                . $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 = "Sie sind angemeldet als "
                . $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>
            Man kann den OpenID Authentifizierungs Prozess auf verschiedenen Wegen anzupassen. Man
            kann,zum Bespiel, die Umleitung des OpenID Servers auf eine eigene Seite erhalten, indem
            der "root" der Webseite spezifiziert wird und ein eigener
            <classname>Zend_OpenId_Consumer_Storage</classname> oder
            <classname>Zend_Controller_Response</classname> verwendet wird. Man kann auch eine
            einfache Registrierungserweiterung verwenden um Informationen über den Benutzer vom
            OpenID Server zu erhalten. Alle diese Möglichkeiten werden detailierter im Kapitel
            <classname>Zend_OpenId_Consumer</classname> beschrieben.
        </para>
    </sect2>
</sect1>
