«前の日記(2007-06-06 (水)) 最新 次の日記(2007-06-10 (日))»  

まちゅダイアリー


2007-06-09 (土)

PHP OpenID を使う (2)

RubyKaigi 2007 の日なのに PHP を使う。

先日の続きで PHP OpenID を使う話。 今日は認証サーバへリダイレクトするときのサンプルコードの中身を見てみよう。 やっていることは、たぶんこんな感じ。

  • ユーザが入力した ID(URL)を受け取る
  • URL から認証サーバを探す
  • OpenID のリクエストを付けて認証サーバへ送る

共通部分 (common.php)

Consumer で使うクラスは以下の2つ。

  • FileStore … Consumer が使うデータ (nonceなど) を格納
  • Consumer … OpenID のクライアント

サンプルコードでは common.php でこのクラスを生成している。

require_once "Auth/OpenID/Consumer.php";
require_once "Auth/OpenID/FileStore.php";

$store_path = "/tmp/_php_consumer_test";
$store = new Auth_OpenID_FileStore($store_path);
$consumer = new Auth_OpenID_Consumer($store);

認証サーバへのリダイレクト (try_auth.php)

エラー処理を省略すると、やっていることは以下の部分になる。

$openid = $_GET['openid_url'];
$auth_request = $consumer->begin($openid);
$auth_request->addExtensionArg('sreg', 'optional', 'email');
$redirect_url = $auth_request->redirectURL($trust_root,
                                           $process_url);

思ったよりもシンプルだった。

  1. $consumer->begin … ユーザが入力したIDから AuthRequest を生成
  2. $auth_request->addExtensionArg … 認証サーバに対して追加の属性 (email) を要求する
  3. $auth_request->redirectURL … 認証サーバへのリダイレクト先を取得する

最後の redirectURL の引数で渡している $trust_root と $process_url は以下のとおり。

$process_url = sprintf("$scheme://%s:%s%s/openid/finish_auth.php",
                       $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'],
                       dirname($_SERVER['PHP_SELF']));

$trust_root = sprintf("$scheme://%s:%s%s",
                      $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'],
                      dirname($_SERVER['PHP_SELF']));

trust_root は現在のディレクトリで、 process_url はそのディレクトリの finish_auth.php になってる。 自分でアプリを作るときは、 trust_root に固定文字列を渡して process_url は動的な文字列を渡すようにするのかな。よく分かってない。 Yet Another Hackadelic - ソースから読むOpenID (1)が参考になりそう。

$auth_request->redirectURL の戻り値に含まれるクエリは以下の通り。

actionopenid&openid
identityhttp%3A%2F%2Fmachu.videntity.org%2F
openid.modecheckid_setup
openid.return_tohttp%3A%2F%2Fwww.machu.jp%3A80%2Fopenid%2Ffinish_auth.php%3Fnonce%3DOX2ioGxj
openid.sreg.optionalemail
openid.trust_roothttp%3A%2F%2Fwww.machu.jp%3A80%2Fopenid

以下のようにLocation を返し、認証サーバへリダイレクトさせる。

header("Location: ".$redirect_url);

認証サーバから認証結果を受け取る (finish_auth.php)

次は認証サーバからの認証結果を受け取るところ。 肝心な箇所だけを抜き出すとこうなる。

$response = $consumer->complete($_GET);
if ($response->status == Auth_OpenID_SUCCESS) {
    $openid = $response->identity_url;
}

認証サーバからの戻り値は、 Auth_OpenID_CANCEL, Auth_OpenID_FAILURE, Auth_OpenID_SUCCESS の3種類があるみたい。 Auth_OpenID_SUCCESS の場合は、 $response->identity_url で利用者の ID が取得できる。 ちなみに、サンプルコードでは、追加の属性(メールアドレスなど)を取得するところも含まれている。 昨日のエラーは、たぶん $consumer->complete で出ているので、あとはライブラリの中を見ていこう。

Tags: PHP OpenID

RubyKaigi 1日目

去年に続いて今年も 日本 Ruby 会議 2007 に参加することができた。幸せだな。 今年は速報ログに詳しい内容が載っているので、特に印象に残ったことだけを書き込めておく。 今回のキーワードは「スケーラビリティ」とか「エンタープライズ」なのかな。

全般

一番新鮮だったのは、会場でプレゼン画面とは別のスクリーンに IRC のチャット画面が表示されていた。 発表者にはプレッシャーかもしれないけど、会場の一体感は確実に高まる。

  • 去年より企業・お仕事方面から注目されてる。
    • スポンサーにビックネームが増えてる!
    • Rails を仕事にしている人が会場の 1/3 も!
    • 1年が経てばいろいろと変わるんだな…。
  • ノベルティがトートバッグ。これは嬉しい。たださんGJ!
  • 去年と変わらないスタッフのイベントにかける愛情。
    • でもロビーとトイレは少し狭かったかも。

Ruby 1.9実装の現状と今後(ささださん)

  • Ruby1.9は12月にリリース。
  • IPA 未踏は2006年度でおしまい。

安定版rubyとその今後(卜部さん)

  • 1.8のメンテナンス版は2世代。
  • メンテナンスのモチベーションはたくさんのコミットを機能追加とバグに振り分けること。

日本Rubyのリファレンスマニュアル2007・初夏(青木さん)

  • リファレンスマニュアルを刷新。データ構造に意味を持たせて検索性を高める。
  • 14,000のメソッド!進捗率は2%。
    • とりあえず tk は除けば?という話。

JRuby: Ruby for the Java Platform(Charles Nutter / Thomas Enebo)

これはエンタープライズ領域での本命かも。Sun のブランド力は大きいからね。

  • JRuby1.0 がリリース!
    • Java の資産が使えるのが一番の強みか。
    • GUI アプリは swing を使うのが楽かな?
  • アプリケーションサーバで JRails を動かす。
    • JDBC ドライバ経由でたくさんのDBと連携できる。

2007年とその先のRuby (まつもとさん)

重要なことをたくさん言っていた気がする。

  • 言語の寿命 > フレームワークの寿命
    • Rails と共倒れ? それとも Rails の次が出る?
    • キーワードは「スケーラビリティ」
  • オープンソースは成長をやめると死んでしまう。
  • IRC で「使う人に愛を要求する言語?」というコメント。

他にも面白い話はたくさんあったけど、もうすぐ空が明るくなりそう(AM3:30)なのでここまで。 1年前と比べて、明らかに Ruby がメジャーになりつつある。 でも、意外にも Ruby ブームに対して冷静な人が多くて安心した。 明日も楽しみ!もう寝ないと…。

Tags: Ruby