PHP OpenID Library で RP Discovery要求対応の例

具体的に言うとdocomo IDのことなんですが(笑)
とりあえずわかったことなんでメモ。

OpenIDそのに関しては前書いたメモがあるんでそっち参照。
で、今回の件。docomo IDの場合、RP Discoveryするんで、TrustRoot のaddressに、Accept: application/xrds+xmlで要求かけてるんですよね。
だから、index.php で、Acceptを判定して、XRDSドキュメントを返してあげればOKです。

PHP OpenID Libraryのexampleだと、追加するコードはこうなります。

--- ../../../w/php-openid-2.1.3/examples/consumer/index.php	2009-04-22 03:31:20.000000000 +0900
+++ ./index.php	2010-03-10 10:10:52.000000000 +0900
@@ -2,6 +2,17 @@
 require_once "common.php";
 
 global $pape_policy_uris;
+
+if ( $_SERVER['HTTP_ACCEPT'] == "application/xrds+xml" ) {
+	// returns XRDS
+	header ( "Content-type: application/xrds+xml" ) ;
+	$fh = fopen( "yadis.xrdf" , "r" ) ;
+	while( !feof( $fh ) ) {
+	 	print fgets( $fh ) ;
+	}
+	fclose( $fh ) ;
+	exit() ;
+}
 ?>
 <html>
   <head><title>PHP OpenID Authentication Example</title></head>

そして、読み込んでるyadis.xrdfはこう。

<?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/return_to</Type>
<URI>http://example.ne.jp:80/php-openid-2.1.3/examples/consumer/finish_auth.php</URI>
</Service>
</XRD>
</xrds:XRDS>

URIには、戻り先のURIを書いてねー。

もうちょっと、まともな書き方(XRDSを返す関数での書き方)があると思いますが、それはあとで調べて書くつもり。

なお、この件は、「docomo ID 認証 インターフェース仕様書」の「3.7.2 OP実装仕様」の表3.2にありるように、

RP Discoveryに失敗した場合、RPにはエラーは返却せず、エラー画面を返却し終了します。

と、なってます。だからいきなりこんな画面が出ます。
2010031001
無事成功するとこうなります。
2010031002
docomo ID 固有の実装・機能に関しては、のちほど書きたいと思います。

参考:RP Discovery対策 – Web Life!!! – Yahoo!ブログ

One Response to “PHP OpenID Library で RP Discovery要求対応の例”

  1. […] てっく★ゆきろぐ Rev2 もっぱら技術系のおはなしをば。 « PHP OpenID Library で RP Discovery要求対応の例 […]