i-modeで簡単ログインを行う方法を調べてみた。

mixiはてなの携帯サイトでやってる簡単ログインってやつを調べてみた。まだi-modeしか調べてないけど、どのキャリアも基本的に端末につけられた一意なIDを送るってことには違いはないと思う。
このIDを保存しておいて、次回ログイン時に同じIDだったら認証OKとしているらしい。(セキュリティ上あまりよくないようだけど、機能を制限したりすればきっと問題は少なくなるはず。重要な情報は携帯には表示しないとか。それは追々・・・。)
で、docomoの場合、端末を識別する方法には次の2種類あるらしいことが分かった。

個体識別番号ってのはリンクやボタンを押したときに出てくる「携帯電話/FOMAカード(UIM)の製造番号を送信します」というダイアログで「はい」を押したときに送信されるやつっぽい。FOMAの場合15桁、movaの場合11桁の数字になる。
iモードIDてのは比較的最近(2008年)に登場した個体識別番号に変わる(?)もの。個体識別番号の送信の時みたいに「はい」「いいえ」のダイアログはでてこない。
そして、以下のサイトの情報を元にして、個体識別情報・iモードIDを取得する簡単なサンプル(JSP)を作ってみた。
重要なお知らせ : 『iモードID』の提供開始について | お知らせ | NTTドコモ
http://www.plusmb.jp/2008/09/09/72.html
「かんたんログイン」 iモードIDの利用 | スマホサイト・アプリをつくろう。
携帯電話・個体識別情報(番号)の取得方法、uid、iモードID(guid)、EZ番号、端末シリアル番号
携帯電話の機種判別 [user-agent] Javaテクニカルサンプル集

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>test</title>
</head>
<body>
docomo test page
<%
// i-mode IDの取得
String iModeId = request.getHeader("x-dcmguid");
// 個体識別番号はuser-agentの中にあるのでそこから抽出
String userAgent = request.getHeader("user-agent");
String id = null;
// http://javatec.blog105.fc2.com/blog-entry-76.html
if (userAgent.indexOf("DoCoMo/1.0") >= 0 && userAgent.indexOf("ser") >= 0) {
	// movaの場合(11桁のUID)
	int startIndex = userAgent.indexOf("ser") + 3;
	id = userAgent.substring(startIndex, startIndex + 11);
} else if (userAgent.indexOf("DoCoMo/2.0") >= 0 && userAgent.indexOf("ser") >= 0) {
	// FOMAの場合(15桁のUID)
	int startIndex = userAgent.indexOf("ser") + 3;
	id = userAgent.substring(startIndex, startIndex + 15);
}
%>
<p>user-agent: <%= userAgent %></p>
<p>your i-mode id: <%= iModeId %></p>
<p>your 個体識別番号: <%= id %></p>
<a href="./index.jsp?guid=ON">send i-mode id</a><br />
<!-- 個体識別番号 -->
<a href="./index.jsp" utn>send 個体識別番号</a>
</body>
</html>

iモードIDってのは簡単に取得できる(request.getHeader("x-dcmguid")これだけ)けど、個体識別情報ってのはuser-agentの中に入ってるからちゃんと抜き出さないといけない。とりあえず取り出せるようにはなってるけど、正確にあってるかは不明・・・(=。=)

あとは、これをどう使うか、が重要。これは宿題だな。