2012年2月19日日曜日

OpenIDつついていたり

OpenID RP的なものを作ってみたりしているけどここにソース載せていったりするのもどうだろうか。
そこまでするのも面倒か。

OpenID OPのURLを短く入力してやるとログインできるdiscoveryという仕組みなところをつくっていく。
discoveryではURLからOPのEndPointを探すのがお仕事。JavaではURLクラスがあるのだけど国際化ドメイン名やURLエンコード的なものは個別にかけてやらないといけないのでどの程度にするか悩み。あとは短めのURLを入力してリダイレクトしていくのでなんとなくHTTPもほしいところだけを実装してみる。

漢字等々が混じったURLをHTTP用に成形するのはこんなかんじにしてみた。一般的なURLに使えるでせう。 (Java)

 public static URI parseURI(String src) throws MalformedURLException,
     UnsupportedEncodingException, URISyntaxException {
        URL url = new URL(src);
        String path = url.getPath().isEmpty() ? "/" : URLDecoder.decode(url.getPath(),
          "utf-8");
        URI uri = new URI(url.getProtocol(), url.getUserInfo(),
          IDN.toASCII(url.getHost()), url.getPort(), path, url.getQuery(),
          url.getRef()).normalize();
        return new URI(uri.toASCIIString());
 }


リダイレクトするのはHTTPのリダイレクトの他、OpenIDはYadisプロトコルというのがあるそうな。HTTPで探す部分だけにしておく。
XRDSにたどり着ければここは完成。HTMLの中に書くのはパースが大変そうなのでとりあえず略。
Googleの場合は手がかりがないので直接XRDSを指定するしかなし。
XRDSにはいろいろ

association 的なところに手をかけてみると今度は暗号的なものがでてきますな。
Diffie-Hellman鍵交換というのは OpenIDについて調べてみたなどいくつかを参考にしてみたりするとよくわかる。このあたりは暗号のことを多少しっておくとおもしろいかも。
サーバ同士で暗号用の鍵になるものを交換しましょうというところをぽちぽち。ただの乱数(JavaならSecureRandom)から生成していいものか、Javaのこれ用のAPIつついてつくればいいのかなどを今 java.sun.com Java ™ 暗号化アーキテクチャー(JCA) リファレンスガイド を読みながら調べている。