OpenIDを触る(古い内容) **************************** Contents: .. contents:: .. toctree:: :maxdepth: 1 はじめに ============= OpenIDのPHPライブラリを利用して, OpenIDの 1)Consumer 2)IdP を作成することができます. (少なくとも日本語では)参考に挙げたURLに従えば, 容易にサンプルページを作成することができます. しかし,OpenIDについての理解をせずに URLの情報だけを見てOpenIDの仕組みを理解することは困難です. まず, `既存記事 ` を見て,感覚をつかみます. インストール ===================== Debianの場合 --------------- :: sudo apt-get install apache2 php5 sudo apt-get install php5-gmp php5-curl はapache2をrestartすること. OpenIDテストコードのダウンロード ======================================== `ここのページ ` より, `1.2.3 ` か `2.1.2 ` をダウンロード. 使うのは1.2.3 2.1.2は,今後のために. 1.x系を使う理由 * OpenID 2.x系は携帯で使えないのではないかという(勝手な)仮定 * 1.x系のほうが仕様策定が年単位で早くAPIも「枯れている」 * 1.x系のほうがシンプルであり試験目的では楽ではないか 今回は,www.hogetan.netというDebian/Lennyのホスト上の ~kanai/keitai/OpenIdTest/examples/consumer/ 上でテストを行いました. /etc/apache2のmods-enable以下で :: sudo ln -s ../mods-available/userdir.load userdir.load sudo ln -s ../mods-available/userdir.conf userdir.conf 次に、 bunzip2 -c php-openid-1.2.3.tar.bz2 | tar xfv - で解凍. 環境のテストテスト ========================== まず環境がOpenIDのサンプル動作に十分な環境下を調べます. http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/detect.php この状態においてエラーが出る状態を試していないのでわかりませんが, 特にエラーがでなければ問題ないと思います. consumeのテスト ========================= Consumeについては,認証ができたかどうかのみを確認します. 特に 今までのテストは, xlune)http://labs.xlune.com/openid/ を利用していましたが,同じことが, http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/consumer/ でできます. 今は「認証」だけを目的にしているので,このテストコードで十分です. ただし,xlineのほうが,いろいろな情報(IdPから送られてきた情報)を表示 できるので,必要に応じて使い分けるのが良いと思います. * IdPの設置 まず,IdPを設置するさいには,データの格納先を決める必要があります. IdPは許可したConsumeなどの情報を保持する必要があるからです. 正直,どこにつくるのが良いのかわかりませんでした. 今回はテストのために,public_html以下に作りました. :: If you are using the filesystem store, your data directory must be readable and writable by www-data and not availabe over the Web. ということなので,www-dataか,SUEXECしているなら,ユーザでかければよさそう. 今回は,777でall permitしています. :: mkdir ~/public_html/keitai/OpenIdTest/examples/database chmod 777 ~/public_html/keitai/OpenIdTest/examples/database setup ================= server.phpの下にconfig.phpを作る必要があります, :: http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/server/setup.php などにアクセスしてください. 次の項目を設定します. MySQLなども指定可能ですが,今回は, 先ほど作成したweb-dataが書き込めるディレクトリを指定します. :: Store method: Filesystem /home/kanai//public_html/keitai/OpenIdTest/examples/database/ "認証に使うURLとそのパスワード"を入力します. たとえば, :: URL: http://www.hogetan.net/~kanai/login.html パスワード:himitsu で作成します. ここでの設定は何ら意味がありません. これからこのURLを証明するという宣言だけです. ダウンロードしてファイルをserver.phpと同じところに設置するか, :: cat > ~kanai/public_html/keitai/OpenIdTest/examples/server/config.php します. :: 注意: 最初にをいれること. これをしないと,うまく,config.phpを解釈してくれません.思いきりはまりました・・・ うまくいくと, :: http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/server/server.php OpenID Server Endpoint と言われます. さて,ここでポイントです. 先ほど,認証するURLとして,http://www.hogetan.net/~kanai/login.html を指定しました. :: cat > ~kanai/public_html/login.html します. * 環境のテストテスト :: http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/consumer/ に入り, :: http://www.hogetan.net/~kanai/login.html と入れてください. 認証の画面で, :: http://www.hogetan.net/~kanai/login.html himitsu といれると認証が成功します. -- * 用語定義 User-Agent: ブラウザ,特にここでは携帯のこと(OpenID用語) * 課題 1. IdPがCookieをrequireすること 2. ConsumeがCookieをrequireすること :: 1と2は,多くのウェブサイトにおいて, 認証後の状態を保持するためにCookieが用いられていることを示します. OpenID自身にはRequireな機能ではないはずです. ただし,今回利用した「最もシンプルなIdPにもCookieが利用されて」います. このため,まずは,Cookieを使わない状態でOpenID APIが利用可能であるかを調べます. 3. User-AgentがLocation,Refererに含むURLの「文字数」をサポートしないこと こればっかりは仕方がないと思っています. なぜなら,「使うIdPなどのドメイン名によって長さが違う」ですし, そもそも,ブラウザの実相依存なので,解決が難しいです. # ただし,最近のブラウザで あえて言うなら,TinyURLではないですが,URL変換のWrapperが -- * 目的 今回は前回のOpenIDライブラリを使い, IdPにおける認証なし化を行います. * 方法 taral氏の公開している認証なしOpenID IdPを利用します. http://taral.livejournal.com/147710.html より, http://taral.dreamhost.com/openid.txt をダウンロードします. :: wget http://taral.dreamhost.com/openid.txt cp openid.txt taral.php これに対して次のようにパッチを当てます. :: diff -ruN openid.txt taral.php --- openid.txt 2007-02-17 04:28:49.000000000 +0900 +++ taral.php 2009-03-08 22:10:20.000000000 +0900 @@ -347,9 +347,11 @@ if (!$root || !valid_root($root, $ret)) { $root = $ret; } +// Comment out for check your root url +// badreq(" $root"); switch ($root) { - case "http://www.lifewiki.net/": - case "http://*.danga.com/openid/demo/": + case "http://www.hogetan.net:80/~kanai/keitai/OpenIdTest/examples/consumer": + case "http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/consumer": break; default: badreq("Requester not trusted"); 最後のbadreqをコメントアウトすることでも対応可能です. ただし,その場合,世界中のサーバからAll Allowな認証システムとなるので,気を付けてください. この上で,"認証するURL" として, ~kanai/public_html/auth2.html に :: と書きます. この上で, http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/consumer/ で http://www.hogetan.net/~kanai/auth2.html と入れると認証が成功します. * 情報の整理 a) まずはログインを無条件に許可する ログイン画面 :: examples/server/lib/render/login.php login_renderで絵画される.login_renderは, ::
を入力として受け入れる. 原則として,server=IdPについてはlib/actions.phpで最初ハンドリングされる. すくなくとも,ログイン時はserver.phpから, action_login がcallされる. 初回はgetでcallされる. 2回目はformにあるとおり,postでcallされる. 認証については, login_checkInput でチェックされる. ログインが成功した場合は, :: setLoggedInUser($openid_url); return doAuth($info); で, setLoggedInUserは, :: $_SESSION['openid_url'] = $identity_url; する.