Previous Next

導入

Zend_InfoCard コンポーネントは、 情報カード (Information Cards) の relying-party サポートを実装したものです。 情報カードは、インターネット上でのユーザ識別情報の管理や ウェブサイトのユーザ認証 (relying party からコールされます) などに用いるものです。

情報カードについて、 あるいはインターネット上の識別メタシステムにおける情報カードの重要性については、 » IdentityBlog を参照ください。

基本的な使用法

Zend_InfoCard の使用法は、 Zend_Auth コンポーネントの一部として Zend_InfoCard 認証アダプタを使用するか、 あるいは単体のコンポーネントとして使用するかのいずれかです。 どちらの場合についても、ユーザから情報カードを受け取るには HTML のログインフォームの中で次のような HTML ブロックを使用します。

この例において、requiredClaims <param> タグで表しているのが、 claim (人の姓名など) と呼ばれる識別情報です。 これは、ウェブサイト ("relying party") が情報カードによる認証を行うために必要となります。

上の HTML をユーザが実行する (クリックする) と、 ブラウザはカード選択プログラムを実行します。 これは、そのサイトの要求を満たす情報カードを表示させるだけでなく、 条件を満たす情報カードが複数存在する場合に好きなものを選択させることができます。 この情報カードは、指定した URL に XML ドキュメントとして POST され、これを Zend_InfoCard コンポーネントで処理することになります。

情報カードは、SSL で暗号化した URL への HTTP POST しかできないことに注意しましょう。 SSL による暗号化を設定する方法については、 ウェブサーバのドキュメントを参照ください。

Zend_Auth の部品としての使用法

このコンポーネントを Zend_Auth 認証システムと組み合わせて使用するには、 Zend_Auth_Adapter_InfoCard を使用する必要があります (これは、単体で配布されている Zend_InfoCard には存在しません)。 この手法での使用例を以下に示します。

addCertificatePair('/usr/local/Zend/apache2/conf/server.key',
                                 '/usr/local/Zend/apache2/conf/server.crt');


    $auth = Zend_Auth::getInstance();

    $result = $auth->authenticate($adapter);

    switch ($result->getCode()) {
        case Zend_Auth_Result::SUCCESS:
            $claims = $result->getIdentity();
            print "Given Name: {$claims->givenname}
"; print "Surname: {$claims->surname}
"; print "Email Address: {$claims->emailaddress}
"; print "PPI: {$claims->getCardID()}
"; break; case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID: print "The Credential you provided did not pass validation"; break; default: case Zend_Auth_Result::FAILURE: print "There was an error processing your credentials."; break; } if (count($result->getMessages()) > 0) { print "
";
        var_dump($result->getMessages());
        print "
"; } } ?>

Simple Login Demo

上の例では、まず最初に Zend_Auth_Adapter_InfoCard のインスタンスを作成して、 カードセレクタから送信された XML データをそこに渡しています。 インスタンスを作成したら、次に SSL 証明書の秘密鍵/公開鍵 ペアを指定する必要があります。 このペアは、HTTP POST を受け取ったウェブサーバで使用しているものです。 これらのファイルを使用して、サーバに送信された情報のあて先の検証を行います。 情報カードを使用するときにはこれらが必要となります。

アダプタの設定がすんだら、あとは Zend_Auth の標準機能を使って情報カードトークンの検証を行い、 getIdentity() で取得した識別情報をもとにユーザの認証を行います。

Zend_InfoCard コンポーネント単体での使用法

Zend_InfoCard コンポーネントを、 それ単体で使用することも可能です。その場合は Zend_InfoCard クラスを直接操作します。 Zend_InfoCard クラスの使用法は、Zend_Auth コンポーネントと組み合わせて使用する場合とほぼ同じです。 以下に使用例を示します。

addCertificatePair('/usr/local/Zend/apache2/conf/server.key',
                                  '/usr/local/Zend/apache2/conf/server.crt');

    $claims = $infocard->process($_POST['xmlToken']);

    if($claims->isValid()) {
        print "Given Name: {$claims->givenname}
"; print "Surname: {$claims->surname}
"; print "Email Address: {$claims->emailaddress}
"; print "PPI: {$claims->getCardID()}
"; } else { print "Error Validating identity: {$claims->getErrorMsg()}"; } } ?>

Simple Login Demo

上の例では、Zend_InfoCard コンポーネントを単体で使用して、ユーザが送信したトークンを検証しています。 Zend_Auth_Adapter_InfoCard の場合と同様、 Zend_InfoCard のインスタンスを作成してから ウェブサーバの SSL 証明書の公開キー/秘密キーペアを設定します。 設定がすんだら、process() メソッドで情報カードの処理を行ってその結果を返します。

Claims オブジェクトの使用法

Zend_InfoCard の使用方法 (単体で使用するか、あるいは Zend_Auth の一部として Zend_Auth_Adapter_InfoCard 経由で使用するか) にかかわらず、情報カードを処理した結果は Zend_InfoCard_Claims オブジェクトとして返されます。 このオブジェクトには assertions (claims) が含まれます。 これは、ユーザ認証の際にあなたのサイトが出した要求にもとづいて、 ユーザが送信したデータから作成したものです。 上の例で示したように、情報カードの妥当性を確認するには Zend_InfoCard_Claims::isVaild() メソッドをコールします。claims そのものを取得するには、 単純に識別子 (givenname など) をオブジェクトのプロパティとして指定してアクセスするか、 あるいは getClaim() メソッドを使用します。

ほとんどの場合においては getClaim() メソッドを使用する必要はありません。 しかし、もし requiredClaims が複数の異なるソース/名前空間からの情報を要求している場合は、 それをこのメソッドで明示的に取り出す必要があります (claim の完全な URI を私、情報カードの中からその値を取得します)。 一般論として、Zend_InfoCard コンポーネントがデフォルトで設定する claim 用 URI は情報カードの中で最もよく用いられるものです。 この場合は単純にプロパティを使用してアクセスすることができます。

検証処理の中で開発者が行わなければならない部分は、 情報カード内の claim の発行元を調べて それが信頼できる情報元かどうかを判定するところです。 これを行うために、Zend_InfoCard_Claims オブジェクトには getIssuer() メソッドが用意されています。 このメソッドは、情報カードの claim の発行元 URI を返します。

既存のアカウントへの情報カードの添付

既存の認証システムに情報カードのサポートを追加することもできます。 そのためには、private personal identifier (PPI) を昔ながらの認証アカウントに埋め込み、 最低限の claim である http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier をリクエストの requiredClaims に指定します。この claim が要求されると、 Zend_InfoCard_Claims オブジェクトはそのカード用の一意な識別子を用意します。 これは、getCardID() メソッドによって行います。

情報カードを既存の昔ながらの認証アカウントに添付する例を、 以下に示します。

// ... 
public function submitinfocardAction() 
{
    if (!isset($_REQUEST['xmlToken'])) {
        throw new ZBlog_Exception('Expected an encrypted token ' .
                                  'but was not provided');
    }
    
    $infoCard = new Zend_InfoCard();
    $infoCard->addCertificatePair(SSL_CERTIFICATE_PRIVATE,
                                  SSL_CERTIFICATE_PUB);
    
    try {
        $claims = $infoCard->process($request['xmlToken']);
    } catch(Zend_InfoCard_Exception $e) {
        // TODO Error processing your request
        throw $e;
    }
    
    if ($claims->isValid()) {
        $db = ZBlog_Data::getAdapter();

        $ppi = $db->quote($claims->getCardID());
        $fullname = $db->quote("{$claims->givenname} {$claims->surname}");
        
        $query = "UPDATE blogusers SET ppi = $ppi, real_name = $fullname WHERE username='administrator'";
        
        try {
            $db->query($query);
        } catch(Exception $e) {
            // TODO Failed to store in DB
        }
        
        $this->view->render();
        return;
    } else {
        throw new 
            ZBlog_Exception("Infomation card failed security checks");
    }
}

Zend_InfoCard アダプタの作成

Zend_InfoCard コンポーネントは、 情報カードの標準規格の変化に対応するために モジュラー構造を採用しています。 現時点では、拡張ポイントの多くは未使用ですので無視できますが、 情報カードの実装においてひとつだけ実装すべき点があります。 それが Zend_InfoCard_Adapter です。

Zend_InfoCard アダプタは、 コンポーネント内でコールバックを使用してさまざまな処理を行います。 たとえば、コンポーネントが情報カードを処理する際の Assertion ID の保存や取得などを行います。 受け取った情報カードの assertion ID の保存は必須ではありませんが、 もしそれに失敗すると、リプレイ攻撃によって認証が信頼できないものになる可能性が発生します。

これを避けるためには、 Zend_InfoCard_Adapter_Interface を実装してそのインスタンスを設定してから process() メソッド (単体) あるいは authenticate() メソッド (Zend_Auth アダプタ) をコールしなければなりません。 このインターフェイスを設定するためのメソッドが setAdapter() です。 以下の例では、Zend_InfoCard アダプタを設定してアプリケーション内で使用しています。

class myAdapter implements Zend_InfoCard_Adapter_Interface 
{
    public function storeAssertion($assertionURI,
                                   $assertionID,
                                   $conditions) 
    {
        /* Store the assertion and its conditions by ID and URI */
    }
    
    public function retrieveAssertion($assertionURI, $assertionID) 
    {
        /* Retrieve the assertion by URI and ID */
    }
    
    public function removeAssertion($assertionURI, $assertionID) 
    {
        /* Delete a given assertion by URI/ID */
    }
}

$adapter  = new myAdapter();

$infoCard = new Zend_InfoCard();
$infoCard->addCertificatePair(SSL_PRIVATE, SSL_PUB);
$infoCard->setAdapter($adapter);

$claims = $infoCard->process($_POST['xmlToken']);
Previous Next
Introduction to Zend Framework
概要
インストール
Zend_Acl
導入
アクセス制御の洗練
高度な使用法
Zend_Amf
導入
Zend_Amf_Server
Zend_Auth
導入
データベースのテーブルでの認証
ダイジェスト認証
HTTP 認証アダプタ
LDAP 認証
Open ID 認証
Zend_Cache
導入
キャッシュの仕組み
Zend_Cache のフロントエンド
Zend_Cache のバックエンド
Zend_Captcha
導入
Captcha の方法
Captcha アダプタ
Zend_Config
導入
動作原理
Zend_Config_Ini
Zend_Config_Xml
Zend_Config_Writer
Zend_Config_Writer
Zend_Console_Getopt
Getopt について
Getopt の規則の宣言
オプションおよび引数の取得
Zend_Console_Getopt の設定
Zend_Controller
Zend_Controller クイックスタート
Zend_Controller の基本
フロントコントローラ
リクエストオブジェクト
標準のルータ
ディスパッチャ
アクションコントローラ
アクションヘルパー
レスポンスオブジェクト
プラグイン
モジュラーディレクトリ構造の規約の使用
MVC での例外
以前のバージョンからの移行
Zend_Currency
Zend_Currency について
通貨の操作方法
以前のバージョンからの移行
Zend_Date
導入
動作原理
基本メソッド
Zend_Date API の概要
日付の作成
日付関数全般用の定数
動作例
Zend_Db
Zend_Db_Adapter
Zend_Db_Statement
Zend_Db_Profiler
Zend_Db_Select
Zend_Db_Table
Zend_Db_Table_Row
Zend_Db_Table_Rowset
導入
Zend_Debug
変数の出力
Zend_Dojo
導入
Zend_Dojo_Data: dojo.data エンベロープ
Dojo ビューヘルパー
Dojo Form Elements and Decorators
Zend_Dom
導入
Zend_Dom_Query
Zend_Exception
例外の使用法
Zend_Feed
導入
フィードの読み込み
ウェブページからのフィードの取得
RSS フィードの使用
Atom フィードの使用
単一の Atom エントリの処理
フィードおよびエントリの構造の変更
独自のフィードクラスおよびエントリクラス
Zend_File
Zend_File_Transfer
Zend_File_Transfer 用のバリデータ
Filters for Zend_File_Transfer
以前のバージョンからの移行
Zend_Filter
導入
標準のフィルタクラス群
フィルタチェイン
フィルタの書き方
Zend_Filter_Input
Zend_Filter_Inflector
Zend_Form
Zend_Form
Zend_Form クイックスタート
Zend_Form_Element を用いたフォーム要素の作成
Zend_Form によるフォームの作成
Zend_Form_Decorator による独自のフォームマークアップの作成
Zend Framework に同梱されている標準のフォーム要素
Zend Framework に同梱されている標準のデコレータ
Zend_Form の国際化
Zend_Form の高度な使用法
Zend_Gdata
Gdata について
AuthSub による認証
Using the Book Search Data API
ClientLogin による認証
Google Calendar の使用法
Google Documents List Data API の使用法
Using Google Health
Google Spreadsheets の使用法
Google Apps Provisioning の使用法
Google Base の使用法
Picasa Web Albums の使用法
YouTube Data API の使用法
Gdata の例外処理
Zend_Http
Zend_Http_Client - 導入
Zend_Http_Client - 高度な使用法
Zend_Http_Client - 接続アダプタ
Zend_Http_Cookie および Zend_Http_CookieJar
Zend_Http_Response
Zend_InfoCard
導入
Zend_Json
導入
基本的な使用法
JSON オブジェクト
XML から JSON への変換
Zend_Json_Server - JSON-RPC server
Zend_Layout
導入
Zend_Layout クイックスタート
Zend_Layout の設定オプション
Zend_Layout の高度な使用法
Zend_Ldap
導入
Zend_Loader
ファイルやクラスの動的な読み込み
プラグインのロード
Zend_Locale
導入
Zend_Locale の使用法
正規化および地域化
日付および時刻の扱い
サポートするロケール
以前のバージョンからの移行
Zend_Log
概要
ライター
フォーマッタ
フィルタ
Zend_Mail
導入
SMTP 経由での送信
SMTP 接続による複数のメールの送信
異なる転送手段の使用
HTML メール
ファイルの添付
受信者の追加
MIME バウンダリの制御
追加のヘッダ
文字セット
エンコーディング
SMTP 認証
セキュアな SMTP トランスポート
メールメッセージの読み込み
Zend_Measure
導入
計測値の作成
計測値の出力
計測値の操作
計測値の型
Zend_Memory
概要
メモリマネージャ
メモリオブジェクト
Zend_Mime
Zend_Mime
Zend_Mime_Message
Zend_Mime_Part
Zend_OpenId
導入
Zend_OpenId_Consumer の基本
Zend_OpenId_Provider
Zend_Paginator
導入
使用法
設定
高度な使用法
Zend_Pdf
導入
PDF ドキュメントの作成および読み込み
PDF ドキュメントへの変更内容の保存
ドキュメントのページ
描画
ドキュメントの情報およびメタデータ
Zend_Pdf モジュールの使用例
Zend_ProgressBar
Zend_ProgressBar
Zend_Registry
レジストリの使用法
Zend_Rest
導入
Zend_Rest_Client
Zend_Rest_Server
Zend_Search_Lucene
概要
インデックスの構築
インデックスの検索
クエリ言語
クエリ作成用の API
文字セット
拡張性
Java Lucene との相互運用
応用
ベストプラクティス
Zend_Server
導入
Zend_Server_Reflection
Zend_Service
導入
Zend_Service_Akismet
Zend_Service_Amazon
Zend_Service_Audioscrobbler
Zend_Service_Delicious
Zend_Service_Flickr
Zend_Service_Nirvanix
Zend_Service_ReCaptcha
Zend_Service_Simpy
導入
Zend_Service_StrikeIron
Zend_Service_StrikeIron: バンドルされているサービス
Zend_Service_StrikeIron: 応用編
Zend_Service_Technorati
Zend_Service_Twitter
Zend_Service_Yahoo
Zend_Session
導入
基本的な使用法
高度な使用法
グローバルセッションの管理
Zend_Session_SaveHandler_DbTable
Zend_Soap
Zend_Soap_Server
Zend_Soap_Client
WSDL Accessor
AutoDiscovery
Zend_Test
導入
Zend_Test_PHPUnit
Zend_Text
Zend_Text_Figlet
Zend_Text_Table
Zend_TimeSync
導入
Zend_TimeSync の動作
Zend_Translate
導入
Zend_Translate のアダプタ
翻訳アダプタの使用法
Migrating from previous versions
Zend_Uri
Zend_Uri
Zend_Validate
導入
標準のバリデーションクラス群
バリデータチェイン
バリデータの書き方
Zend_Version
Zend Framework のバージョンの取得
Zend_View
導入
コントローラスクリプト
ビュースクリプト
ビューヘルパー
Zend_View_Abstract
Zend_Wildfire
Zend_Wildfire
Zend_XmlRpc
導入
Zend_XmlRpc_Client
Zend_XmlRpc_Server
Zend Framework のシステム要件
PHP のバージョン
PHP の拡張モジュール
Zend Framework のコンポーネント
Zend Framework の依存性
Zend Framework PHP 標準コーディング規約
概要
PHP ファイルの書式
命名規約
コーディングスタイル
Zend Framework Performance Guide
Introduction
Class Loading
Internationalization (i18n) and Localization (l10n)
View Rendering
著作権に関する情報