OpenID : session_type DH_SHA1 or DH-SHA256 ? mixi.jpの罠 ?
PearのOpenIDライブラリを使っているのですが、
mixi.jp の OpenIDを利用したところ以下のエラーが返された。
“Missing dh_server_public parameter in association response”
https://mixi.jp/openid_server.pl
データは取得出来ていたけど、dh_server_publicがかえってこなかった。。。
ようやく原因がわかりました。。。
session_typeには、
no-encryption
DH-SHA1
DH-SHA256
の3つがあるのですが、sslのときは、当然利用が必要です。
mixi.jpはhttps://につなぎに行くのですが
versionが
http://specs.openid.net/auth/2.0/server
のため
OpenID_Association_Request
のconstruct内で
versionから
session_type = DH-SHA256
と設定されました。
残念ながら mixi.jpはDH-SHA256では、
dh_server_public
enc_mac_key
が返されませんでした ; o ;
仕方ないのでmixiのときは、 DH_SHA1 にして無事認証完了^-^;
// Set defaults $this->message->set('openid.mode', OpenID::MODE_ASSOCIATE); if (OpenID::$versionMap[$version] == OpenID::NS_2_0) { $this->message->set('openid.ns', OpenID::NS_2_0); $this->message->set('openid.assoc_type', self::ASSOC_TYPE_HMAC_SHA256); +++ if(preg_match('/mixi.jp/',$this->opEndpointURL)){ +++ $this->message->set('openid.session_type', self::SESSION_TYPE_DH_SHA1); +++ }else{ $this->message->set('openid.session_type', self::SESSION_TYPE_DH_SHA256); +++ } } else { $this->message->set('openid.assoc_type', self::ASSOC_TYPE_HMAC_SHA1); $this->message->set('openid.session_type', self::SESSION_TYPE_DH_SHA1); }
yahooは、すべて対応しています。=> http://developer.yahoo.co.jp/other/openid/
mixiは、対応しているのかなんなのか表記がありません。。。 => http://developer.mixi.co.jp/openid/spec
ここでは、Yahooさんが勝利です。一日潰れた。。。