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

    <title>Open ID 認証</title>

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

        <para>
            <classname>Zend_Auth_Adapter_OpenId</classname>
            は、リモートの OpenID サーバを使用したユーザ認証を行います。
            この認証方式では、ユーザがウェブアプリケーションに対して送信するのは
            OpenID の識別子のみとなります。その識別子は OpenID
            プロバイダにリダイレクトされ、そこでパスワードなどを用いて識別子の所有者情報を確認します。
            ここで入力したパスワードは、ウェブアプリケーション側には知られることはありません。
        </para>

        <para>
            OpenID の識別子は単なる <acronym>URI</acronym> で、
            指し示す先のウェブページにはそのユーザに関する情報や特別なタグが含まれます。
            タグに記述されているのは、どのサーバに対してどの情報を送信するのかという情報です。
            OpenID についての詳細は
            <ulink url="http://www.openid.net/">OpenID の公式サイト</ulink>
            を参照ください。
        </para>

        <para>
            <classname>Zend_Auth_Adapter_OpenId</classname> クラスは
            <classname>Zend_OpenId_Consumer</classname> コンポーネントのラッパーで、
            OpenID の認証プロトコルを実装しています。
        </para>

        <note>
            <para>
                <classname>Zend_OpenId</classname> は、<ulink url="http://php.net/gmp">GMP
                拡張モジュール</ulink> が使用可能な場合はそれを使用します。
                <classname>Zend_Auth_Adapter_OpenId</classname> を使う場合は、
                <acronym>GMP</acronym> 拡張モジュールを有効にしておくとよりよいパフォーマンスが得られるでしょう。
            </para>
        </note>
    </sect2>

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

        <para>
            他の <classname>Zend_Auth</classname> アダプタ同様、<classname>Zend_Auth_Adapter_OpenId</classname>
            クラスは <classname>Zend_Auth_Adapter_Interface</classname> を実装しています。
            このインターフェイスで定義されているメソッドは
            <methodname>authenticate()</methodname> です。
            このメソッドは認証そのものを行います。
            このメソッドをコールする前にオブジェクトを準備しておく必要があります。
            「準備」とは、OpenID の識別子を設定したりその他の
            <classname>Zend_OpenId</classname> 固有のオプションを設定したりということです。
        </para>

        <para>
            しかし、他の <classname>Zend_Auth</classname> アダプタとは異なり、
            このアダプタは認証処理を外部のサーバで行います。
            また認証は二段階の <acronym>HTTP</acronym> リクエストで行います。
            したがって、<methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
            を二度コールする必要があります。
            一度目のコールでは、このメソッドは何も返さずに OpenID サーバにリダイレクトします。
            認証が終わってリダイレクト先から戻ってきたら、もう一度
            <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
            をコールしてサーバから戻されたリクエストのシグネチャを検証し、
            認証手続きを進めます。このときは、このメソッドは
            <classname>Zend_Auth_Result</classname> オブジェクトを返します。
        </para>

        <para>
            次の例は、<classname>Zend_Auth_Adapter_OpenId</classname> の使用方法を示すものです。
            先ほど説明したように、<methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
            が 2 回コールされています。一度目、つまり <acronym>HTML</acronym> フォームから送信されたときは
            <varname>$_POST['openid_action']</varname> が <emphasis>"login"</emphasis>
            となっており、二度目、つまり OpenID サーバから <acronym>HTTP</acronym> リダイレクトで戻ってきたときは
            <varname>$_GET['openid_mode']</varname> あるいは <code>$_POST['openid_mode']</code>
            が設定されています。
        </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>
            OpenID 認証手続きをカスタマイズして、
            OpenID サーバからリダイレクトで戻ってくる先を別のページ
            (そのウェブサイトの "ルート" ページなど) にすることもできます。
            この場合は、独自の
            <classname>Zend_OpenId_Consumer_Storage</classname> あるいは
            <classname>Zend_Controller_Response</classname> を使用します。
            また、Simple Registration Extension
            を使用して OpenID サーバからユーザ情報を取得することも可能です。
            これらについての詳細は
            <classname>Zend_OpenId_Consumer</classname> のマニュアルを参照ください。
        </para>

    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
