このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0081

OpenIDライブラリ

 本パッケージは、「janrain社」が提供する「php-openid」ライブラリを CodeIgniterから簡単に利用するためのライブラリです。

 本パッケージのライブラリを利用することで、「RP(Relying Party)」、つまり、OpenIDでログインできる
サイトを構築することができます。

 以下の「OP(OpenID Provider)」で、OpenID認証の動作確認を行なっております。


OpenIDライブラリの準備

Janrain OpenID Libraries をインストール

 「Janrain OpenID Libraries」は、PHPで利用可能なOpenIDライブラリです。

 「GitHub」からダウンロードして、サーバに配置します。
 今回は、「application/」ディレクトリに「includes」ディレクトリを作成して、そこに配置することにします。

    cd application/
    mkdir includes
    cd includes/
    wget https://github.com/openid/php-openid/archive/master.zip -O php-openid-master.zip
    unzip php-openid-master.zip

本サイトの「third_party」パッケージをインストール

「info.ci-guide.openid.1.x.x.zip」を「application/third_paty/」ディレクトリに置き、解凍します。

    cd application/third_party/
    unzip info.ci-guide.openid.1.x.x.zip

 パッケージパス

 パッケージパスを「application/config/autoload.php」 自動ロード設定ファイルで設定するか、
「CI_Loader」コアクラスの「add_package_path()」 メソッドで「info.ci-guide」パッケージのパスを設定します。

  • application/config/autoload.php
  • $autoload['packages'] = array(APPPATH . 'third_party/info.ci-guide');
  • add_package_path()
  • $this->load->add_package_path(APPPATH . 'third_party/info.ci-guide');

OpenIDライブラリ設定

 設定ファイルでは、複数の「OP」を定義できるように、詳細設定項目は2次元連想配列で設定します。
1次元の連想配列キーに「OP設定識別子」を定義し、2次元の連想配列キーを設定項目として詳細設定を定義します。

  • 設定例
  • $config['openid_provider'] = 'google_openid';
    
    $config['google_openid']['openid_identifier'] = 'https://www.google.com/accounts/o8/id';
    $config['google_openid']['openid_form_id']    = 'openid_message';
    $config['google_openid']['openid_realm']      = '/openid/google/';
    $config['google_openid']['openid_return_to']  = '/openid/google/return_to/';
    $config['google_openid']['openid_filestore_path'] = '/tmp/openid';
    $config['google_openid']['openid_assoc_type'] = NULL;
    
php_openid_path Janrainのphp-openidライブラリを配置したPATHを設定します。
例: APPPATH . '/includes/php-openid-master'
openid_provider デフォルトの「OP設定識別子」を設定します。複数の「OP」に対し、詳細設定項目を定義できるようになっています。
openid_identifier OP IdentifierのURIを設定します。
openid_form_id 認証要求<form>タグの「id=」属性値を設定します。
openid_realm レルムを設定します。URIパスのみ設定すると、site_url()で返るURLが付加されます。
openid_return_to 戻りURIを設定します。URIパスのみ設定すると、site_url()で返るURLが付加されます。
openid_filestore_path 認証情報をキャッシュする保存ディレクトリを設定します。書き込み権限が必要です。
openid_assoc_type アソシエーション形式、及び、アソシエーションセッション形式を配列で設定します。暗号化しない場合はNULLを設定します。
例: array('HMAC-SHA256', 'DH-SHA256')
openid_xrds OPが 「RP Discovery」を行う場合、「XRDS」応答を行うURIを設定します。
OPからのレルムURIへの「RP Discovery」リクエストに対するレスポンス時に「X-XRDS-Location:」HTTPヘッダの値として出力します。
OPが 「RP Discovery」を行わない場合この設定を定義する必要はありません。

OpenIDライブラリのロード

 本パッケージがロードされていれば、通常のライブラリと同様に、 「Loadオブジェクト」の「library()」メソッドでロードすることができます。

    $this->load->add_package_path(APPPATH . 'third_party/info.ci-guide');
    $this->load->library('cig_openid');

 また、設定情報をロード時にコンストラクタに渡すことも可能です。

    $config['openid_identifier']     = 'https://www.google.com/accounts/o8/id';
    $config['openid_form_id']        = 'openid_message';
    $config['openid_realm']          = '/openid/google/';
    $config['openid_return_to']      = '/openid/google/return_to/';
    $config['openid_filestore_path'] = '/tmp/openid';
    $config['openid_assoc_type']     = NULL;
    
    $this->load->library('cig_openid', $config);
    

OpenIDライブラリの利用

initialize($config = array())

 設定情報を動的に初期化します。

    $this->load->library('cig_openid');
    
    $config['openid_provider']       = 'docomo';
    $config['openid_identifier']     = 'https://i.mydocomo.com';
    $config['openid_form_id']        = 'openidparam';
    $config['openid_realm']          = '/openid/docomo/';
    $config['openid_return_to']      = '/openid/docomo/return_to/';
    $config['openid_filestore_path'] = '/tmp/openid';
    $config['openid_assoc_type']     = array('HMAC-SHA256', 'DH-SHA256');
    $config['openid_xrds']           = '/openid/docomo/xrds/';
    
    $this->cig_openid->initialize($config);
    

set_provider($provider)

 設定ファイル「third_party/info.ci-guide/config/cig_openid.php」に定義してある設定情報に初期化します。
 設定ファイルに定義済みの「OP設定識別子」を引数に指定します。

    $this->cig_openid->set_provider('google_openid');

try_auth()

 「OP Identifier」に「OP Discovery」リクエストをし、クライアントが認証要求するための 「OP End Point URL」を取得しリダイレクト「HTML FORM」を生成して返します。

    if ($html = $this->cig_openid->try_auth()) {
        $this->output->set_output($html);
    } else {
        // エラー処理
    }
    

finish_auth()

 「return_to」の戻りURIでリクエストを受けた際に、このメソッドを実行するとユーザの「OpenID」を取得することができます。

    if ($openid = $this->cig_openid->finish_auth()) {
        // $openid を利用してログイン処理を行う
    } else {
        // エラー処理
    }
    

set_xrds_location()

 OP が 「RP Discovery」リクエストしてくる場合、レルムとして設定したメソッドで 「X-XRDS-Location: 」HTTPヘッダを出力する必要があります。

 「set_xrds_location()」は、設定項目「openid_xrds」で設定したURIを出力します。

    // $config['openid_xrds'] = '/openid/xrds/';
    $this->cig_openid->set_xrds_location();
    X-XRDS-Location: http://your.site/openid/xrds/

xrds($return_to = NULL, $output = TRUE)

 OP からの 「RP Discovery」要求に対し、「XRDS」データを出力します。

 設定項目「return_to」で設定した戻りURIとは別の戻りURIを指定したい場合は、 第一引数に「戻りURI」を指定することができます。

    $this->cig_openid->xrds();

 第二引数に「FALSE」を指定するとXRDSデータを出力せずに、返します。

    $xrds = $this->cig_openid->xrds(NULL, FALSE);
    echo $xrds;

    flush();
    // 重たい処理

 docomo(ドコモ docomo ID)では、RP Discovery の応答が必須となっていますので、このメソッドで XRDS を出力してください。

OpenIDライブラリのSample

 本パッケージ内にサンプルプログラムを用意していますので、動作確認や開発の参考にご利用ください。

 「samples/openid/」ディレクトリを、「application/contorllers/」ディレクトリ直下にコピーしてください。

    cd application/
    cp -ir third_party/info.ci-guide/samples/openid controllers/

    下記のようなURIパスにアクセスするとデモページが表示されます。