アーカイブ

2008 年 1 月 のアーカイブ

Yahoo! JAPANがOpenIDを発行

2008 年 1 月 31 日 コメントはありません

CNET Japanの記事から

ヤフーは1月30日、オープンな認証規格「OpenID」の発行サービスをベータ版として開始した。OpenIDを利用すれば外部サイトでもYahoo! JAPAN IDが利用できるようになると同時に、ウェブサービスの開発者はヤフーが抱える2000万ID以上のアクティブユーザーに向けたサービスの開発が可能となる。

予想より早く開始しましたね。 YahooのOpenIDはセキュリティに配慮しているほか、既存OpenIDプロバイダと違う点も見られます。

  1. OpenID 2.0仕様
  2. ログインに使用するID
  3. YahooJAPAN IDの隠蔽

OpenID対応サイトでログインする際は、「yahoo.co.jp」と 入力するだけでよく、YahooサイトでYahooのIDとパスワードを入力して認証します。 OpenID対応サイトには、「https://me.yahoo.co.jp/a/tsEJe4MCcbXZyYq0VzUTfWemVtG0」のような、YahooのIDを含まないOpenIDが通知される仕組みです。

ということで早速ログインを試みたところ、「このサイトにログインできません。」というエラーが表示されました。 どうもリダイレクト時にreturn_to?のホスト確認をしているらしく、 「localhost」などのテスト環境は弾かれます。 正式なドメインからアクセスすると成功しました。

以下はYahooから返信される情報を一部抜粋したものです。

array (
  'openid_ns' => 'http://specs.openid.net/auth/2.0',
  'openid_mode' => 'id_res',
  'openid_return_to' => 'http://www.softama.com/openid_test/result.php?janrain_nonce=2008-01-31T02%3A31%3A04ZrWi9Zr',
  'openid_claimed_id' => 'https://me.yahoo.co.jp/a/tsEJe4MCcbXZyYq0VzUTfWemVtG0#6c56c',
  'openid_identity' => 'https://me.yahoo.co.jp/a/tsEJe4MCcbXZyYq0VzUTfWemVtG0',
  'openid_assoc_handle' => 'YPKehsnKyC3deS46Zt4oZQqrkYd3CWVx5b6vGbLq24Nc.lJ0mpXD3D3GOhCURjzvb3VRkIkJgCeqQBUPpht25UJDfslk6QNg4Q0F5qIuCOI04zPYG_BXskrS9aHgmkTYkQ--',
  'openid_realm' => 'http://www.softama.com/openid_test/',
  'openid_response_nonce' => '2008-01-31T02:31:36Z4vQ0bDrKtR9L4I52M10eFeQceUophyRhaQ--',
  'openid_signed' => 'assoc_handle,claimed_id,identity,mode,ns,op_endpoint,response_nonce,return_to,signed',
  'openid_op_endpoint' => 'https://open.login.yahooapis.jp/openid/op/auth',
  'openid_sig' => 'N6a5hPDj4L36B5jrEgMoZG4luiE=',
)

identityはYahooの登録情報ページから参照できるOpenIDと同じです。 ところが、claimed_idには#6c56cのような末尾が付いていました。(#以降がころころ変わるようなら問題ですが、多分大丈夫でしょう。 少し様子を見るつもりです。)

追記: Discover時に取得できるXRDSドキュメントを載せておきます。

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
    xmlns:xrds="xri://$xrds"
    xmlns:openid="http://openid.net/xmlns/1.0"
    xmlns="xri://$xrd*($v*2.0)">
  <XRD>
    <Service priority="0">
      <Type>http://specs.openid.net/auth/2.0/server</Type>
      <URI>https://open.login.yahooapis.jp/openid/op/auth</URI>
    </Service>
  </XRD>
</xrds:XRDS>

この時点ではclaimed_idが判明していません。 従って、リダイレクト時に要求するclaimed_idとidentityには「http://specs.openid.net/auth/2.0/identifier_select」 を設定しています。

Yahooのような多くのユーザを抱えるサイトがOpenIDを発行することで、これからOpenIDに対応するサイトが増えていくことでしょう。 今後もOpenIDの動向に注目したいと思います。

カテゴリー: Web技術

OpenIDに対応しました

2008 年 1 月 29 日 コメントはありません

RSS+リーダーでOpenIDのログインに対応しました。 OpenIDをお持ちの方はユーザ登録することなしにログインできるようになります。 近く公開しますので、もうしばらくお待ちください。

(この認証技術は、最近YahooやGoogleがOpenIDへの対応を表明したことから、 急速に普及が進むことが予想されています。)

カテゴリー: ソフタマリーダー

OpenIDについて調べてみる テストコード

2008 年 1 月 26 日 コメントはありません

前回のエントリに続いてOpenIDのテスト話。 以下はテストコードから抜粋したものです。

// Consumerを作成
$store = new Auth_OpenID_FileStore($store_path);
$consumer = new Auth_OpenID_Consumer($store);

// OpenIDの認証プロセスを開始
if (!$req = $consumer->begin($openid))
	error_exit("指定されたOpenIDは無効です。");

// OpenIDプロバイダにリダイレクト
$url = $req->redirectURL($trust_root, $return_to);
if (Auth_OpenID::isFailure($url))
	error_exit("リダイレクトに失敗しました。");
header("Location: ".$url);

続いて受信フェーズ

// Consumerを作成
$store = new Auth_OpenID_FileStore($store_path);
$consumer = new Auth_OpenID_Consumer($store);

// OpenIDプロバイダからの返信情報
$resp = $consumer->complete($return_to);
if ($resp->status != Auth_OpenID_SUCCESS)
	error_exit("認証失敗:".$resp->status);
$openid = $resp->getDisplayIdentifier();

// 結果表示
print_html("result.html", array("msg"=>"認証成功: id=$openid"));

以上。 これで動作しています。

今回テストしてみて、初回のbegin で結構な時間を待たされるのが気になります。(特にWindows環境で顕著。PHPのmax_execution_timeを超えます) 他にもポリシーをどうするかとか、リダイレクトをformで実装する方法などを調べなくては。

余談ですが、openid.ne.jpのサイトはJanRainのserver.phpライブラリで構築されているようです。 (偶然サーバエラーを見かけて、そのファイル名がまさにこのライブラリでした…)

カテゴリー: Web技術

OpenIDについて調べてみる その2

2008 年 1 月 24 日 コメントはありません

OpenIDの実装をどうするか考えてみる。 仕様に沿って1から全て作るのは時間がもったいない。幸いにも先人たちが作成したライブラリが利用できるので利用することに。

ここに各種言語向けのライブラリが用意されている。
http://wiki.openid.net/Libraries

PHPでOpenID 2.0にも対応しているJanRainのライブラリを選択した。(多言語に展開しているし実績がありそうなので…)
http://www.openidenabled.com/php-openid/

サンプルコードも単純で理解しやすく、完璧ではないがphpDocumentorのドキュメントも用意されている。
今回はServerではなくConsumerを作成するのが目的。流れを理解するのにphpDocのconsumer.phpの説明がとても役に立つ。(OpenIDについてもうまく説明されているので最初からここを見ればよかった)

このライブラリを使った処理の流れ。

  1. Auth_OpenID_Consumerオブジェクトを作成。(パラメータにAuth_OpenID_FileStoreとPHPセッションを渡す)
  2. beginメソッドをコールして、Auth_OpenID_AuthRequestオブジェクトを得る。(beginメソッドにOpenIDを渡す)
  3. 2のredirectURLメソッドをコールしてOpenIDプロバイダにリダイレクトする。(ここで戻り先のURLを指定する)

前半終了。OpenIDプロバイダから戻り先のURLにリダイレクトしてきたら後半開始。

  1. Auth_OpenID_Consumerオブジェクトを作成。(前半と同じPHPセッションなので、結果、前半と同じ内容のオブジェクトを得るはず)
  2. completeメソッドをコールして結果を確認。

基本これだけなので簡単だ。 後でテストスクリプトを組んで実験してみよう。

カテゴリー: Web技術

OpenIDについて調べてみる

2008 年 1 月 24 日 コメントはありません

前々から興味のあったOpenIDについて調べてみた。 ユーザとして利用するのはもちろんだが、今回はWebサービス側の情報を収集して、最終的にはテストも兼ねてRSS+リーダーに実装したいと考えている。

OpenIDの仕様は公式サイトで確認。
http://openid.net/developers/specs/

「OpenID Authentication 2.0 Final」と書かれた資料の日付が2007/12/7 なことから、つい最近2.0の仕様がまとまったことが推測できる。(まだ世の中に2.0は浸透していない?)

仕様書を読んで大雑把に理解した処理の流れ。

  1. OpenIDを入力してもらう。(OpenIDは実在するURLで表現される)
  2. OpenIDのURLにアクセスすると、XRDSまたはHTMLドキュメントを取得できて、ここにOpenIDプロバイダのEndpoint URLが記述されている。
  3. Endpoint URLに接続要求してセッションを確立する。
  4. Endpoint URLに認証要求と共にリダイレクトする。(ここで戻り先のURLも指定しておく)
  5. OpenIDプロバイダの認証画面が表示される。ユーザはパスワードを入力して認証する。
  6. 4で指定した戻り先のURLに認証結果と共にジャンプしてくる。結果を確認してログイン完了。

Endpoint URLとは、認証プロセスをやり取りするためにOpenIDプロバイダが用意したURL。 ここにコマンドを投げれば結果を返してくれる。 紹介されている要求コマンドはassociate, checkid_immediate, checkid_setup, check_authentication。

checkid_*はブラウザごとリダイレクトするもので、他はhttpのPOSTを投げると直ぐに結果が得られる。(前者はindirect request、後者はdirect requestと書かれている)

取り合えずここまで。

カテゴリー: Web技術