OpenIDを触る(古い内容)

Contents:

はじめに

OpenIDのPHPライブラリを利用して, OpenIDの 1)Consumer 2)IdP を作成することができます. (少なくとも日本語では)参考に挙げたURLに従えば, 容易にサンプルページを作成することができます. しかし,OpenIDについての理解をせずに URLの情報だけを見てOpenIDの仕組みを理解することは困難です.

まず, 既存記事 <http://www.thinkit.co.jp/free/article/0712/7/3/> を見て,感覚をつかみます.

インストール

Debianの場合

sudo apt-get install apache2  php5
sudo apt-get install php5-gmp php5-curl

はapache2をrestartすること.

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用語)

  • 課題
  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 に

<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;

する.