巷でブームになりつつある?OpenIDを試してみました。今回は、Think IT の記事を頼りに、「PHP OpenID Library」のコンシューマサンプルプログラムを動かしてみます
参考にした記事はこれです。
[Think IT] 第2回:PHPで作ろうConsumer

まずは「PHP OpenID Library」からバージョン2の安定板をダウンロード。展開して、examples/consumer ディレクトリの中身を適当な場所にアップロード、さらにAuthディレクトリも同じ場所にアップロードします。

/openid/index.php
/openid/common.php
/openid/try_auth.php
/openid/finish_auth.php
/openid/Auth/*
ブラウザでindex.phpにアクセスするとログイン画面が現れます。そこで先日 OpenID.ne.jpで入手したIDを入力して Verify ボタンを押してみると。。。早速怒られました(汗)
Could not create the FileStore directory'/tmp/_php_consumer_test'.
Please check the effective permissions.
ファイルの保存場所を作ろうとしたけど、アクセス権がないとの事。ソースを眺めてみると、common.phpの中に該当箇所を発見。
$store_path = "/tmp/_php_consumer_test";
しょうがないので、保存ディレクトリ store を手動で作成(*)。パーミッションを変更して、$store_path を書き換えます。
*環境によっては storeのサブディレクトリ「associations」「nonces」「temp」も手動で作成しておいたほうが良いようです。
$store_path = "/store";
気を取り直してもう一度トライしてみると。。。またまた怒られました(汗)
Fatal error: Define Auth_OpenID_RAND_SOURCE as null to continue
with an insecure random number generator. 
in /***/***/openid/Auth/OpenID/CryptUtil.php on line 52
Auth/OpenID/CryptUtil.php の該当箇所を見てみると、Auth_OpenID_RAND_SOURCE を開こうとして失敗しています。
$f = @fopen(Auth_OpenID_RAND_SOURCE, "r");
セキュリティー上はよくないが、nullに設定すれば動くよと言ってるので、同ファイル上部の define 値を書き換えます。
define('Auth_OpenID_RAND_SOURCE', NULL);
再度IDを入力して Verify ボタンを押すと、ちょいと時間がかかって、今度はうまく OpenID.ne.jp の認証画面へ飛びました。パスワードを入れてログインボタンを押すと、「OpenID確認」というページが現れます。とりあえず、「一度だけ認証」を押してみると、元のページにリダイレクトされ、ついに認証完了だ!と思いきや
OpenID authentication failed: Nonce already used or out of range
むむむ?どいうこと?

とりあえず、エラーを起こしている箇所をソースで探します。
if (!$this->store->useNonce($server_url, $timestamp, $salt)) {
	return new Auth_OpenID_FailureResponse($endpoint,
				 "Nonce already used or out of range");
}
この関数が定義されてる場所を FileStore.php にて発見。
FileStore::useNonce($server_url, $timestamp, $salt)
順番にif文に exit(0); を埋め込んでみたら、ここで反応あり。
$result = @fopen($filename, 'x');

if ($result === false) {
	exit(0); //
	return false;
} else {
	fclose($result);
	return true;
}
ファイルが開けないのか。。。どのファイルだろうと思ってechoしてみると、
/store/nonces/~~~
とでました。サブディレクトリの所有者・パーミッションの問題だねこれは。ということで、
/store/associations
/store/nonces
/store/temp
も手動で作成・パーミッションをセット。再度認証をやり直してみると。。。 やった!見事認証できましたよ。
2008年04月14日17時17分53秒
カテゴリ: PHP OpenID Library