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 のリクエスト時に証明書を読み込ませる必要があるそうです。
詳しくは、
- mixi OpenIDのサンプルコードをPHP OpenID Libraryを使って動かしてみた(訂正) – 大阪 本町で働くITな おっさんダイアリー
- jognote in silico — Blog Archive » cURL に HTTPS でアクセスできるように証明書を追加する
をご覧ください。
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の開発環境でうまくいってもサーバで実行するとうまくいかず、色々と苦労しました。でも、ほとんどの人が同じ道を通っているんだなとつくづく感じた次第です。
先人のみなさまに感謝。
コメントを残す