巷でブームになりつつある?OpenIDを試してみました。今回は、Think IT の記事を頼りに、「PHP OpenID Library」のコンシューマサンプルプログラムを動かしてみます
参考にした記事はこれです。
[Think IT] 第2回:PHPで作ろうConsumer
まずは「PHP OpenID Library」からバージョン2の安定板をダウンロード。展開して、examples/consumer ディレクトリの中身を適当な場所にアップロード、さらにAuthディレクトリも同じ場所にアップロードします。
*環境によっては storeのサブディレクトリ「associations」「nonces」「temp」も手動で作成しておいたほうが良いようです。
とりあえず、エラーを起こしている箇所をソースで探します。
[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 52Auth/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
カテゴリ: PHP OpenID Library