at posts/single.html

PHP OpenID を使う

PukiWiki で OpenID を使ってみたい。 具体的には以下のようなことを考えている。

  • 編集は誰でもできる
  • ログインしていない人が編集する場合は Akismet で SPAM 判定する
  • OpenID でログインした人は編集する場合は、 SPAM 判定を実施しない

思っていたよりも Akismet による誤判定が多かったのが理由。 まぁ、 Wiki はコメントと違って、ページ全体が SPAM チェックの対象になっちゃうからなぁ。

ってことで、まずは OpenID のライブラリの使い方から。

ダウンロード&インストール

About - OpenID Enabledより PHP 用の OpenID ライブラリを取得する。 PEAR が使えない環境なので、手動で取得・展開する。

$ wget http://www.openidenabled.com/resources/downloads/php-openid/PHP-openid-1.2.2.tar.gz
$ tar zxvf PHP-openid-1.2.2.tar.gz
$ cd PHP-openid-1.2.2
$ ls
Auth/      COPYING  README.Debian  Tests/  doc/       package.xml
CHANGELOG  README   Services/      admin/  examples/  package2.xml

とりあえず大切なのは以下のファイルやディレクトリかな。

  • Auth … OpenID ライブラリの本体
  • Services … OpenID ライブラリが依存している Yadis ライブラリ
  • examples … サンプルプログラム

examples には consumer と server の 2 つのディレクトリがある。 今回は認証サーバを立てるつもりはないので、 consumer を使う。 examples/README を読みながら、セットアップ開始。

セットアップ

ライブラリとサンプルプログラムを配置する。 以下は悪い例。本当はライブラリは public_html に置かない方がよい。

$ mkdir ~/public_html/openid
$ mv Auth Services ~/public_html/openid       ← 必要なライブラリをコピー
$ mv example/consumer/* ~/public_html/openid  ← サンプルプログラムをコピー

example/consumer には以下のファイルが含まれている。

$ ls examples/consumer
common.php  finish_auth.php  index.php  try_auth.php

それぞれのファイルの役割は以下の通り。

  • index.php … 最初に表示するページ。ログインID (URL) を入力する。
  • try_auth.php … ユーザが入力したログインIDを受け取り、認証サーバへのリクエストを生成する。
  • finish_auth.php … 認証サーバからの認証結果を受け取り結果を表示する(画面はindex.phpをインクルードしている

元々の finish_auth.php だと index.php の include に失敗するので、下記のように修正する。

-include 'index.php';
+include './index.php';

これで設置完了。 試しに使ってみたところ、 videntity.org では認証できた。 でも TypeKey ではログイン後に以下のようなエラーになってしまう。

Warning: No HTTP code returned in /home/machu/www/www.machu.jp/openid/Services/Yadis/Pa ranoidHTTPFetcher.php on line 154
OpenID authentication failed: Server denied check_authentication

認証サーバ (TypeKey) への接続に失敗しているっぽいけどよく分からない。 認証サーバから戻ってきたとき (finish_auth.php) も、サーバ間で通信しているのかな?

ちなみに、 TypeKey での OpenID アカウントは下記の通り。 ドキュメントは見つからなかったけど、 TypeKey のプロフィールページに openid の META タグが含まれていることから分かった。

profile.typekey.com/[TypeKeyのアカウント名]/

さて、サンプルコードの中を見ていくか。

関連する日記