OpenIDを触る(古い内容)¶
Contents:
はじめに¶
OpenIDのPHPライブラリを利用して, OpenIDの 1)Consumer 2)IdP を作成することができます. (少なくとも日本語では)参考に挙げたURLに従えば, 容易にサンプルページを作成することができます. しかし,OpenIDについての理解をせずに URLの情報だけを見てOpenIDの仕組みを理解することは困難です.
まず, 既存記事 <http://www.thinkit.co.jp/free/article/0712/7/3/> を見て,感覚をつかみます.
OpenIDテストコードのダウンロード¶
ここのページ <http://www.openidenabled.com/php-openid/> より, 1.2.3 <http://openidenabled.com/files/php-openid/packages/php-openid-1.2.3.tar.bz2> か 2.1.2 <http://openidenabled.com/files/php-openid/packages/php-openid-2.1.2.tar.bz2> をダウンロード. 使うのは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
します.
注意: 最初に<?php,最後に?>をいれること.
これをしないと,うまく,config.phpを解釈してくれません.思いきりはまりました・・・
うまくいくと,
- ::
- http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/server/server.php OpenID Server Endpoint <link rel=”openid.server” href=”http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/server/server.php” />
と言われます. さて,ここでポイントです. 先ほど,認証するURLとして,http://www.hogetan.net/~kanai/login.html を指定しました.
cat > ~kanai/public_html/login.html
<html>
<head>
<link rel="openid.server" href="http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/server/server.php" />
</head>
</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用語)
- 課題
- IdPがCookieをrequireすること
- 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 に
<html>
<head>
<link rel="openid.server" href="http://www.hogetan.net/~kanai/keitai/taral.php" />
</head>
</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は,
<form method="post" action="http://www.hogetan.net/~kanai/keitai/OpenIdTest/examples/server/server.php/login">
を入力として受け入れる.
原則として,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;
する.