|
|
@@ -1,6 +1,6 @@
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
<!-- Reviewed: no -->
|
|
|
-<!-- EN-Revision: 15846 -->
|
|
|
+<!-- EN-Revision: 15867 -->
|
|
|
<sect1 id="zend.auth.adapter.http">
|
|
|
|
|
|
<title>HTTP 認証アダプタ</title>
|
|
|
@@ -14,61 +14,63 @@
|
|
|
<ulink url="http://tools.ietf.org/html/rfc2617">RFC-2617</ulink> や
|
|
|
<ulink url="http://en.wikipedia.org/wiki/Basic_authentication_scheme">ベーシック</ulink>、
|
|
|
<ulink url="http://en.wikipedia.org/wiki/Digest_access_authentication">ダイジェスト</ulink>
|
|
|
- HTTP 認証にほぼ準拠した実装を提供します。ダイジェスト認証とは
|
|
|
- HTTP 認証方式のひとつで、パスワードを平文でネットワークに送信する必要がないという点で
|
|
|
+ <acronym>HTTP</acronym> 認証にほぼ準拠した実装を提供します。ダイジェスト認証とは
|
|
|
+ <acronym>HTTP</acronym> 認証方式のひとつで、パスワードを平文でネットワークに送信する必要がないという点で
|
|
|
ベーシック認証より優れています。
|
|
|
</para>
|
|
|
|
|
|
<para>
|
|
|
<emphasis>主な機能</emphasis>
|
|
|
- <itemizedlist>
|
|
|
- <listitem>
|
|
|
- <para>
|
|
|
- ベーシック認証およびダイジェスト認証の両方のサポート
|
|
|
- </para>
|
|
|
- </listitem>
|
|
|
- <listitem>
|
|
|
- <para>
|
|
|
- サポートしているすべてのスキームを試みるので
|
|
|
- クライアントは、サポートする任意のスキームで応答可能
|
|
|
- </para>
|
|
|
- </listitem>
|
|
|
- <listitem>
|
|
|
- <para>
|
|
|
- プロキシ認証のサポート
|
|
|
- </para>
|
|
|
- </listitem>
|
|
|
- <listitem>
|
|
|
- <para>
|
|
|
- テキストファイルを用いた認証のサポート、
|
|
|
- あるいはデータベースなどのその他のソースによる認証用インターフェイスの提供
|
|
|
- </para>
|
|
|
- </listitem>
|
|
|
- </itemizedlist>
|
|
|
</para>
|
|
|
|
|
|
+ <itemizedlist>
|
|
|
+ <listitem>
|
|
|
+ <para>
|
|
|
+ ベーシック認証およびダイジェスト認証の両方のサポート
|
|
|
+ </para>
|
|
|
+ </listitem>
|
|
|
+ <listitem>
|
|
|
+ <para>
|
|
|
+ サポートしているすべてのスキームを試みるので
|
|
|
+ クライアントは、サポートする任意のスキームで応答可能
|
|
|
+ </para>
|
|
|
+ </listitem>
|
|
|
+ <listitem>
|
|
|
+ <para>
|
|
|
+ プロキシ認証のサポート
|
|
|
+ </para>
|
|
|
+ </listitem>
|
|
|
+ <listitem>
|
|
|
+ <para>
|
|
|
+ テキストファイルを用いた認証のサポート、
|
|
|
+ あるいはデータベースなどのその他のソースによる認証用インターフェイスの提供
|
|
|
+ </para>
|
|
|
+ </listitem>
|
|
|
+ </itemizedlist>
|
|
|
+
|
|
|
<para>
|
|
|
- RFC-2617 の機能のうち、以下についてはまだ実装されていません。
|
|
|
- <itemizedlist>
|
|
|
- <listitem>
|
|
|
- <para>
|
|
|
- nonce 値を追いかけることによる "stale" のサポート、
|
|
|
- および再試行攻撃への防御
|
|
|
- </para>
|
|
|
- </listitem>
|
|
|
- <listitem>
|
|
|
- <para>
|
|
|
- 整合性チェックを含む認証 "auth-int"
|
|
|
- </para>
|
|
|
- </listitem>
|
|
|
- <listitem>
|
|
|
- <para>
|
|
|
- Authentication-Info HTTP ヘッダ
|
|
|
- </para>
|
|
|
- </listitem>
|
|
|
- </itemizedlist>
|
|
|
+ <acronym>RFC</acronym>-2617 の機能のうち、以下についてはまだ実装されていません。
|
|
|
</para>
|
|
|
|
|
|
+ <itemizedlist>
|
|
|
+ <listitem>
|
|
|
+ <para>
|
|
|
+ nonce 値を追いかけることによる "stale" のサポート、
|
|
|
+ および再試行攻撃への防御
|
|
|
+ </para>
|
|
|
+ </listitem>
|
|
|
+ <listitem>
|
|
|
+ <para>
|
|
|
+ 整合性チェックを含む認証 "auth-int"
|
|
|
+ </para>
|
|
|
+ </listitem>
|
|
|
+ <listitem>
|
|
|
+ <para>
|
|
|
+ Authentication-Info <acronym>HTTP</acronym> ヘッダ
|
|
|
+ </para>
|
|
|
+ </listitem>
|
|
|
+ </itemizedlist>
|
|
|
+
|
|
|
</sect2>
|
|
|
|
|
|
<sect2 id="zend.auth.adapter.design_overview">
|
|
|
@@ -77,8 +79,8 @@
|
|
|
|
|
|
<para>
|
|
|
このアダプタはふたつのサブコンポーネントで構成されています。
|
|
|
- ひとつは HTTP 認証クラス自身、そしてもうひとつはいわゆる "リゾルバ" です。
|
|
|
- HTTP 認証クラスは、ベーシック認証およびダイジェスト認証を扱うロジックをカプセル化します。
|
|
|
+ ひとつは <acronym>HTTP</acronym> 認証クラス自身、そしてもうひとつはいわゆる "リゾルバ" です。
|
|
|
+ <acronym>HTTP</acronym> 認証クラスは、ベーシック認証およびダイジェスト認証を扱うロジックをカプセル化します。
|
|
|
このクラスは、リゾルバを使用してなんらかの保存データ (デフォルトはテキストファイル)
|
|
|
からクライアントの ID を探します。認証データが "解決"
|
|
|
されると、クライアントから送信された値に基づいて認証が成功したかどうかを判断します。
|
|
|
@@ -94,61 +96,66 @@
|
|
|
<classname>Zend_Auth_Adapter_Http</classname> クラスのコンストラクタには、
|
|
|
設定配列を渡す必要があります。使用可能なオプションはいくつかあり、
|
|
|
その中には必須のものもあります。
|
|
|
- <table id="zend.auth.adapter.configuration_options.table">
|
|
|
- <title>設定オプション</title>
|
|
|
- <tgroup cols="3">
|
|
|
- <thead>
|
|
|
- <row>
|
|
|
- <entry>オプション名</entry>
|
|
|
- <entry>必須かどうか</entry>
|
|
|
- <entry>説明</entry>
|
|
|
- </row>
|
|
|
- </thead>
|
|
|
- <tbody>
|
|
|
- <row>
|
|
|
- <entry><emphasis>accept_schemes</emphasis></entry>
|
|
|
- <entry>Yes</entry>
|
|
|
- <entry>
|
|
|
- そのアダプタがクライアントからどの認証スキームを受け取るのかを設定します。
|
|
|
- <emphasis>'basic'</emphasis> や <emphasis>'digest'</emphasis>
|
|
|
- を含む空白区切りの文字列でなければなりません。
|
|
|
- </entry>
|
|
|
- </row>
|
|
|
- <row>
|
|
|
- <entry><emphasis>realm</emphasis></entry>
|
|
|
- <entry>Yes</entry>
|
|
|
- <entry>
|
|
|
- 認証レルムを設定します。ユーザ名は、指定したレルム内で一意でなければなりません。
|
|
|
- </entry>
|
|
|
- </row>
|
|
|
- <row>
|
|
|
- <entry><emphasis>digest_domains</emphasis></entry>
|
|
|
- <entry><emphasis>'accept_schemes'</emphasis> が <emphasis>'digest'</emphasis> を含む場合は Yes</entry>
|
|
|
- <entry>
|
|
|
- 空白区切りの URI のリストで、同じ認証情報が有効となる場所を指定します。
|
|
|
- URL は同一サーバ上でなくてもかまいません。
|
|
|
- </entry>
|
|
|
- </row>
|
|
|
- <row>
|
|
|
- <entry><emphasis>nonce_timeout</emphasis></entry>
|
|
|
- <entry><emphasis>'accept_schemes'</emphasis> が <emphasis>'digest'</emphasis> を含む場合は Yes</entry>
|
|
|
- <entry>
|
|
|
- nonce の有効期限を秒数で指定します。以下の注意を参照ください。
|
|
|
- </entry>
|
|
|
- </row>
|
|
|
- <row>
|
|
|
- <entry><emphasis>proxy_auth</emphasis></entry>
|
|
|
- <entry>No</entry>
|
|
|
- <entry>
|
|
|
- デフォルトでは無効です。有効にすると、
|
|
|
- 元のサーバの認証のかわりにプロキシで認証を行います。
|
|
|
- </entry>
|
|
|
- </row>
|
|
|
- </tbody>
|
|
|
- </tgroup>
|
|
|
- </table>
|
|
|
</para>
|
|
|
|
|
|
+ <table id="zend.auth.adapter.configuration_options.table">
|
|
|
+ <title>設定オプション</title>
|
|
|
+ <tgroup cols="3">
|
|
|
+ <thead>
|
|
|
+ <row>
|
|
|
+ <entry>オプション名</entry>
|
|
|
+ <entry>必須かどうか</entry>
|
|
|
+ <entry>説明</entry>
|
|
|
+ </row>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <row>
|
|
|
+ <entry><emphasis>accept_schemes</emphasis></entry>
|
|
|
+ <entry>Yes</entry>
|
|
|
+ <entry>
|
|
|
+ そのアダプタがクライアントからどの認証スキームを受け取るのかを設定します。
|
|
|
+ <emphasis>'basic'</emphasis> や <emphasis>'digest'</emphasis>
|
|
|
+ を含む空白区切りの文字列でなければなりません。
|
|
|
+ </entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry><emphasis>realm</emphasis></entry>
|
|
|
+ <entry>Yes</entry>
|
|
|
+ <entry>
|
|
|
+ 認証レルムを設定します。ユーザ名は、指定したレルム内で一意でなければなりません。
|
|
|
+ </entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry><emphasis>digest_domains</emphasis></entry>
|
|
|
+ <entry>
|
|
|
+ <emphasis>'accept_schemes'</emphasis> が <emphasis>'digest'</emphasis> を含む場合は Yes
|
|
|
+ </entry>
|
|
|
+ <entry>
|
|
|
+ 空白区切りの URI のリストで、同じ認証情報が有効となる場所を指定します。
|
|
|
+ URL は同一サーバ上でなくてもかまいません。
|
|
|
+ </entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry><emphasis>nonce_timeout</emphasis></entry>
|
|
|
+ <entry>
|
|
|
+ <emphasis>'accept_schemes'</emphasis> が <emphasis>'digest'</emphasis> を含む場合は Yes
|
|
|
+ </entry>
|
|
|
+ <entry>
|
|
|
+ nonce の有効期限を秒数で指定します。以下の注意を参照ください。
|
|
|
+ </entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry><emphasis>proxy_auth</emphasis></entry>
|
|
|
+ <entry>No</entry>
|
|
|
+ <entry>
|
|
|
+ デフォルトでは無効です。有効にすると、
|
|
|
+ 元のサーバの認証のかわりにプロキシで認証を行います。
|
|
|
+ </entry>
|
|
|
+ </row>
|
|
|
+ </tbody>
|
|
|
+ </tgroup>
|
|
|
+ </table>
|
|
|
+
|
|
|
<note>
|
|
|
<para>
|
|
|
現在の <emphasis>nonce_timeout</emphasis> の実装には、いくつかの副作用があります。
|
|
|
@@ -171,7 +178,7 @@
|
|
|
ベーシック認証では、ユーザのパスワードを Base64 でエンコードしたものを受け取ります。
|
|
|
ダイジェスト認証では、ユーザ名、レルムおよびパスワード
|
|
|
(をコロンでつなげたもの) のハッシュを受け取ります。
|
|
|
- 現在サポートしているハッシュアルゴリズムは MD5 のみです。
|
|
|
+ 現在サポートしているハッシュアルゴリズムは <acronym>MD5</acronym> のみです。
|
|
|
</para>
|
|
|
|
|
|
<para>
|
|
|
@@ -194,30 +201,42 @@
|
|
|
<methodname>resolve()</methodname> メソッドはテキストファイルを走査し、
|
|
|
ユーザ名とレルムにマッチする行を探します。テキストファイルのフォーマットは
|
|
|
Apache の htpasswd ファイルと似た形式で
|
|
|
- <programlisting language="txt"><![CDATA[
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="txt"><![CDATA[
|
|
|
<username>:<realm>:<credentials>\n
|
|
|
]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
のようになります。個々の行は
|
|
|
ユーザ名、レルムおよび認証情報の三つのフィールドで構成されており、
|
|
|
それらがコロンで区切られています。リゾルバは認証情報フィールドの内容を理解することはできません。
|
|
|
取得した値をそのまま呼び出し元に返します。したがって、
|
|
|
同じ形式でベーシック認証およびダイジェスト認証の両方に対応できます。
|
|
|
ベーシック認証では、このフィールドは平文テキストで書く必要があります。
|
|
|
- ダイジェスト認証では、これは先ほど説明したような MD5 ハッシュとなります。
|
|
|
+ ダイジェスト認証では、これは先ほど説明したような <acronym>MD5</acronym> ハッシュとなります。
|
|
|
</para>
|
|
|
|
|
|
<para>
|
|
|
ファイルリゾルバを作成する方法は次の二通りで、どちらも同じくらい簡単です。まずは
|
|
|
- <programlisting language="php"><![CDATA[
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
$path = 'files/passwd.txt';
|
|
|
$resolver = new Zend_Auth_Adapter_Http_Resolver_File($path);
|
|
|
]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
もうひとつは
|
|
|
- <programlisting language="php"><![CDATA[
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
$path = 'files/passwd.txt';
|
|
|
$resolver = new Zend_Auth_Adapter_Http_Resolver_File();
|
|
|
$resolver->setFile($path);
|
|
|
]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
指定したパスが空だったり読み込みできなかったりした場合は、
|
|
|
例外をスローします。
|
|
|
</para>
|
|
|
@@ -232,7 +251,9 @@ $resolver->setFile($path);
|
|
|
|
|
|
<para>
|
|
|
まず、必須設定項目を含む配列を作成します。
|
|
|
- <programlisting language="php"><![CDATA[
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
$config = array(
|
|
|
'accept_schemes' => 'basic digest',
|
|
|
'realm' => 'My Web Site',
|
|
|
@@ -240,6 +261,8 @@ $config = array(
|
|
|
'nonce_timeout' => 3600,
|
|
|
);
|
|
|
]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
この配列は、アダプタに対してベーシック認証およびダイジェスト認証の両方を受け付けるように指定します。
|
|
|
また、<filename>/members_only</filename> および <filename>/my_account</filename>
|
|
|
の配下では認証済みアクセスが必要となるようにします。
|
|
|
@@ -248,18 +271,21 @@ $config = array(
|
|
|
</para>
|
|
|
|
|
|
<para>
|
|
|
- 次に、Zend_Auth_Adapter_Http オブジェクトを作成します。
|
|
|
- <programlisting language="php"><![CDATA[
|
|
|
+ 次に、<classname>Zend_Auth_Adapter_Http</classname> オブジェクトを作成します。
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
require_once 'Zend/Auth/Adapter/Http.php';
|
|
|
$adapter = new Zend_Auth_Adapter_Http($config);
|
|
|
]]></programlisting>
|
|
|
- </para>
|
|
|
|
|
|
<para>
|
|
|
ベーシック認証およびダイジェスト認証の両方をサポートしているので、
|
|
|
ふたつのリゾルバオブジェクトを作成する必要があります。
|
|
|
これは、単にふたつの異なるクラスを作成するだけの簡単なことです。
|
|
|
- <programlisting language="php"><![CDATA[
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
$basicResolver = new Zend_Auth_Adapter_Http_Resolver_File();
|
|
|
$basicResolver->setFile('files/basicPasswd.txt');
|
|
|
|
|
|
@@ -269,12 +295,13 @@ $digestResolver->setFile('files/digestPasswd.txt');
|
|
|
$adapter->setBasicResolver($basicResolver);
|
|
|
$adapter->setDigestResolver($digestResolver);
|
|
|
]]></programlisting>
|
|
|
- </para>
|
|
|
|
|
|
<para>
|
|
|
最後に、認証を行います。このアダプタは、
|
|
|
リクエストオブジェクトおよびレスポンスオブジェクトの両方を参照する必要があります。
|
|
|
- <programlisting language="php"><![CDATA[
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
assert($request instanceof Zend_Controller_Request_Http);
|
|
|
assert($response instanceof Zend_Controller_Response_Http);
|
|
|
|
|
|
@@ -286,7 +313,6 @@ if (!$result->isValid()) {
|
|
|
// ユーザ名/パスワードが間違っている、あるいはパスワード入力をキャンセルした
|
|
|
}
|
|
|
]]></programlisting>
|
|
|
- </para>
|
|
|
|
|
|
</sect2>
|
|
|
|