F.Ko-Jiの「一秒後は未来」

PHP OpenID Library を使ってみた

梅酒.inでOpenIDでのログインに対応したのですが、実装する上で色々と困るところが多かったので少しメモしておきます。かなり内容をかいつまんでいますが、ご了承ください。

PHP用のOpenIDライブラリを入手

OpenIDのログインを実装するにあたって、OpenID Enabled で配布されている PHP OpenID Library を利用しました。2008年10月30日現在でバージョンは 2.1.2 です。

ダウンロードしたファイルを解凍し、Auth ディレクトリを自分のサイトのインクルードパスが通っている適当な場所に丸ごとコピーします。

サンプルコードを読んで理解する

このライブラリにはサンプルコードが examples ディレクトリに用意されています。どのような処理を実装すればいいかは、サンプルを見て理解するのがいいです。

情報の格納方法を選択する

このライブラリでは、OpenIDの認証サーバとのやり取りに必要な情報を格納するために、ファイルやデータベースを利用することができます。

ファイルベースで利用したい場合は

Auth/OpenID/FileStore.php

を使い、MySQLを使いたい場合は

Auth/OpenID/MySQLStore.php

を使います。なお、データベースを利用したい場合は、PEARのDBライブラリが必要です。(PEAR::DBを利用する前提でライブラリが作られています。)

PEAR::DBは使っていないのですが、ここだけは仕方なく使うことにしました。

Auto_OpenID_MySQLStoreを利用する場合

以下は Auto_OpenID_MySQLStore を利用する場合の例です。

protected function &getConsumer() {
    $store = $this->getStore();
    $consumer =& new Auth_OpenID_Consumer($store);
    return $consumer;
}

protected function getStore() {
    $options = array(
        'persistent' => true,
        'portability' => 'DB_PORTABILITY_ALL',
    );
    $db = DB::connect(DSN, $options);
    return new Auth_OpenID_MySQLStore($db);
}

なお、情報を格納するためのテーブルは自動的に作られるそうですが、試してみるとうまく作成されなかったため、自分で作成しました。

以下の2個のテーブルがあれば大丈夫です。

CREATE TABLE `oid_nonces` (
  `server_url` varchar(2047) NOT NULL,
  `timestamp` int(11) NOT NULL,
  `salt` char(40) NOT NULL,
  UNIQUE KEY `server_url` (`server_url`(255),`timestamp`,`salt`)
) ENGINE=InnoDB;

CREATE TABLE `oid_associations` (
  `server_url` blob NOT NULL,
  `handle` varchar(255) NOT NULL,
  `secret` blob NOT NULL,
  `issued` int(11) NOT NULL,
  `lifetime` int(11) NOT NULL,
  `assoc_type` varchar(64) NOT NULL,
  PRIMARY KEY  (`server_url`(255),`handle`)
) ENGINE=InnoDB;

mixiのOpenIDで認証がうまくいかない場合

mixiはSSLでOpenIDの認証をおこなうため、cURL のライブラリが HTTPS のページにアクセスできるように証明書をインストール、もしくは curl のリクエスト時に証明書を読み込ませる必要があるそうです。

詳しくは、

をご覧ください。

XREAでライブラリがうまく動作しない場合

これは非常に困りました。が、ググると救いの神が。どうも XREA サーバの libxml にバグがあるらしく、XMLのパースでエラーとなってしまうそうです。

» Geez in the universe: XREA / CORESERVER で OpenID を使うと Yahoo や livedoor が使えない問題

上記のリンク先に、応急処置のコードがありました。そのコードで Auth/Yadis/XML.php を丸ごと置き換えました。

Auth_OpenID_RAND_SOURCEでエラーが出る場合

さらに、レンタルサーバを利用しているためだと思うのですが、

Define Auth_OpenID_RAND_SOURCE as null to continue with an insecure random number generator.

というエラーが出てしまいました。このエラーは /dev/urandom を読み込めない場合に発生するらしく、回避するためには、

if (@is_readable('/dev/urandom')) {
    define('Auth_OpenID_RAND_SOURCE', '/dev/urandom');
} else {
    define('Auth_OpenID_RAND_SOURCE', NULL);
}

のように Auth_OpenID_RAND_SOURCE を NULL にしておけばいいそうです。

» NP_OpenIDをXREA/CORESERVERで使う場合の注意 – NP_cles()

まとめ

今回 OpenID でのログインを実装する上で困った点は大体以上のようなものです。Macの開発環境でうまくいってもサーバで実行するとうまくいかず、色々と苦労しました。でも、ほとんどの人が同じ道を通っているんだなとつくづく感じた次第です。

先人のみなさまに感謝。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など