日向夏特殊応援部隊

俺様向けメモ

速報、1500万人が使える mixi OpenID の技術面を解説するでござるの巻

と言う訳でついに来ましたね。

中の人、お疲れ様でした。

実はさっきまで mixi に行って技術的な意見交換などしてきました。mixi OpenID の技術的な側面なんかを簡単に紹介したいと思います。

ミクシィ認証

これは普通の OpenID Provider の挙動と同じです。僕のアカウントは http://mixi.jp/show_profile.pl?id=29704 なので僕の OP Local Identifier は、

https://id.mixi.jp/29704

ここでお気づきの方も居るかと思いますが、OP Local Identifier 自体も https で提供されています。さて最初の html の内容を確認しておきます。

<link href="https://mixi.jp/openid_server.pl" rel="openid2.provider" title="[mixi] mixi OpenID" />
<link href="https://mixi.jp/openid_server.pl" rel="openid.server" title="[mixi] mixi OpenID" />

OP Endpoint URL も https で提供されてますね。ついでに Yadis にも対応との事なので試してみます。

$ lwp-request -m HEAD https://id.mixi.jp/29704 | grep XRDS
X-XRDS-Location: https://mixi.jp/xrds_signon.pl

と返ってくるので、

$ lwp-request https://mixi.jp/xrds_signon.pl

を実行して、

<?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/signon</Type>
      <Type>http://openid.net/sreg/1.0</Type>
      <Type>http://openid.net/extensions/sreg/1.1</Type>
      <Type>http://openid.net/srv/ax/1.0</Type>
      <URI>https://mixi.jp/openid_server.pl</URI>
    </Service>
    <Service priority="1">
      <Type>http://openid.net/signon/1.1</Type>
      <Type>http://openid.net/sreg/1.0</Type>
      <Type>http://openid.net/extensions/sreg/1.1</Type>
      <Type>http://openid.net/srv/ax/1.0</Type>
      <URI>https://mixi.jp/openid_server.pl</URI>
    </Service>
  </XRD>
</xrds:XRDS>

AX や SREG に対応していると言う主張されているのが分かります。一点思ったのはユーザごとに XRDS 文書を提供してもいいんじゃないのかなと思いました。と言うのも http://mixi.jp/ に対してディスカバリかけた時も同じ XRDS に行き着くからです。まぁ、いつでも代えられるだろうし、そうでなければならない理由も特に無いのでいいですけどもw

マイミクシィ認証とコミュニティ認証

これが他の OpenID Provider とは大きく異なる点です。mixiOpenID を使う場合に、特定のユーザとマイミクしてるかどうかや、特定のコミュニティに属しているかどうかを OpenID Protocol を用いて認証する事が出来ます。

登場人物を分かりやすくする為に、id:amachang (あま二郎さん) に登場して貰う事にしましょう。僕のブログのコメントに OpenID が使えるシーンにて、僕のマイミクさんならばコメントを書き込めると言うシーンで使えます。これはどういう風にやるかと言うと、

  1. 自分の OP Local Identifier のお尻に /friends をつける
    1. https://id.mixi.jp/29704/friends
    2. 便宜上、これをマイミクシィ認証での Claimed Identifier とします
  2. id:amachang が僕のブログのコメントをつける際に、mixi でログイン的なボタンを押します
    1. このボタンを押した際に自動的にマイミクシィ認証での Claimed Identifier で認証フローに進みます
  3. 普通に mixi でログインして、OpenID のフロー通り redirect して僕のブログの return_to URL に戻ってきます

と言う感じなんだけど、その際の値がちょっと変わっていて、

リクエスト時

Claimed Identifier (openid.claimd_id)
https://id.mixi.jp/29704/friends

レスポンス時

Claimed Identifier (openid.claimed_id)
https://id.mixi.jp/29704/friends/XXXXXX (XXXXXX は id:amachangmixi での id)
OP Local Identifier (openid.identity)
https://id.mixi.jp/XXXXXX

と言う形で返って来ます。リクエスト時の Claimed Identifier とは異なる値がレスポンスで返されるのが特徴です。

従って、11.4. Verifying Signatures における署名生成の元データに openid.claimd_id を用いるので OP が作った署名と RP が (リクエスト時のデータを元に) 作った署名は異なるので、直接検証 (check_authentication) に移行します。*1

コミュニティ認証もほとんど同じで、{id}/friends の代わりに /community/{community_id} を用いるだけです。詳しくは 仕様 << mixi Developer Center (ミクシィ デベロッパーセンター) を見て下さい。

まとめ

是非はともかくして面白い仕組みを引っさげてリリースと言うところはさすがだなと思いました。ちょっと工夫すれば mixi 上での知人関係やらを利用したサイトを作るのも出来ちゃいますね。

是非皆さんも mixi OpenID を利用したサイトを作ってみて下さい。

*1:実はこれ見落としてて問題ないと思ってましたw サーセン