iモードIDとutn(端末情報)との違い
「DoCoMoのiモードIDについて - maru.cc@はてな」でも書いたとおり、DoCoMoでiモードIDという、契約者を識別するIDを勝手サイトでも使用することが出来るようになった。
元々、iモードIDが使える前にも、utnと言われる端末情報やFOMAカードの番号を取得する方法はあったが、それとはまったく意味が違うことになる。
iモードIDの仕様については、SSLで送ってこないとか、formのpost時の要求方法が変だとか、セキュリティ的にどうかとういのはもちろんあるし、SSLで使えないくせにCookieベースのセッションが使えないとか、不満はいろいろあるが、それでも使えるようになったことで意義があると思う。
そもそものutnとiモードIDとの違い
■utn(端末情報)
mova端末の場合には、端末製造番号
FOMa端末の場合には、FOMAカードの番号と端末製造番号
が、それぞれ送られてくる。
■iモードID
契約者ごとの番号が送られてくる。
これを見ると、FOMAに限って言えば、FOMAカードは契約ごとで、機種変しても変わることがないので、iモードIDと同じような意味合いがあると思う。
しかし、movaからの場合には意味合いがまったく違うことになる。
それ以外の利点などとしては、utnもiモードIDも、どちらも取得したいページのひとつ前で準備をする必要がある。
utnの場合には、aタグやformタグに utn という属性をつける必要がある。
iモードIDの場合にも、guid=on というパラメータをつける必要がある。
一見、同じように感じるかもしれないが、意味合いがまったく違う。
utnの場合には、必ず前のページで準備をしないと、サーバ側からは取得する方法が無い。
一方、iモードIDの場合には、POSTの場合には難しいが、GETであれば、guid=on というパラメータを付けてリダイレクトすることにより取得することが出来る。
例)
a.php < aタグのあるページ guid=on記述なし ↓ b.php < iモードIDが必要なページ パラメータなしで取得できない ↓ここでリダイレクト b.php?guid=on < iモードID取得
少しわかりにくいかもしれないが、リダイレクトで取得できるというのには大きな意味があると思う。
SSLページであっても、非SSLのリダイレクタを通すことで、iモードIDを取得することが出来る。
例)
<?php if (!isset($_SERVER['HTTP_X_DCMGUID']) && !isset($_GET['guid'])) { header('location: http://example.com/index.php?guid=on'); exit; } ?> <html> <head> </head> <body> <pre> <?php var_dump($_GET); var_dump($_SERVER); ?> </pre> </body> </html>
$_GETで、guidというパラメータが無ければ、リダイレクトするという方法だ。
いま、4月半ばにリリースする案件で、早速iモードIDを使用して作成しています。もちろん、うまく使えなければutnを使う予定でしたが。
実案件で何かあったら、またエントリを書いてみたいと思います。
追記(2008-07-11)
「セキュリティ的に」ということに関して、高木さんが詳しく書かれていました。
「高木浩光@自宅の日記 - 日本のインターネットが終了する日」
Webをやるものとして、もっとこういった意識を持たなければならないと感じた。
そーいえば、以前、auのEZ番号(当時はサブスクライバID)を勝手サイトへの通知も不可にするという噂があった。
確かに大きな問題で、安易に勝手サイトを作る身として楽になったという意識ではいけないと思う。
結局のところ、早く3キャリア共にちゃんとしたcookieを使えるようにして欲しい。
DoCoMoのiモードIDについて
DoCoMoが2008-03-31から、iモードID通知機能サービスを開始しました。
これで、勝手サイトでもutnの端末情報取得のダイアログを出すことなくユーザの一意のIDを他キャリア同様に取得できるようになります。
参考
「重要なお知らせ : 『iモードID』の提供開始について | NTTドコモ」
「開発者向け情報 | サービス・機能 | NTTドコモ」
ke-tai.orgでもさっそくエントリがあがっていました。
「本日提供が開始された「iモードID」機能を早速試してみました | ke-tai.org - インフィニットループ」
phpの場合は次のような変数から取得することが出来ます。
var_dump($_SERVER['HTTP_X_DCMGUID']); var_dump(getenv('HTTP_X_DCMGUID'));
$_SERVERはiniの設定に依存するのでgetenvの方でも取れます。
注意点
■パラメータの大文字小文字は区別しない
引数のパラメータの大文字小文字は区別しないようですが、値は「on」固定のようです
<a href="xxxx?guid=on">guid=on</a><br> <a href="xxxx?GUID=ON">GUID=ON</a><br> <a href="xxxx?guid=ON">guid=ON</a><br>
また、パラメータを完全マッチしているのかguidというパラメータが複数あったとして、guid=onがあればOKなようです。
<a href="xxxx?guid=off&guid=on">guid=off</a><br>
■formの場合
getのformでは、通常通りhiddenタグで持たせることで取得できます。
<form action="xxxx" method="get"> <input type="hidden" name="guid" value="ON"> <input type="submit" name="" value="submit"> </form>
postの場合には、hiddenタグで渡すことは出来ません。
POSTのBODY部については対象外
以下のようにする必要があります。
<form action="xxxx?guid=ON" method="post"> <input type="submit" name="" value="submit"> </form>
逆に、getでactionにつけた場合には、端末仕様によるかもしれませんが、手元のSO905iでは送ってきませんでした。
<form action="xxxx?guid=ON" method="get"> <input type="submit" name="" value="submit"> </form>
サーバ側で$_GETを取得しても入っていないので、formでgetの場合に、actionに指定したパラメータは無視される端末仕様なのかもしれません。
■iモードID自体は大文字小文字区別する
iモードIDは、パラメータと違い、大文字小文字が区別されます。
そのため、DBに保存する場合には、データ型に注意する必要があります。
MySQLならば 「VARCHAR」ではなく、「VARCHAR BINARY」にする必要があります。
大文字小文字の区別をちゃんとしていないと、会員制サイトや、iモードIDで回数制限等する場合には、他人のページにログインできたりしてしまうので注意が必要です。(誤解を招きそうな文章だったので少し追記)
■iモードIDの一意性について
一度、付与したiモードIDは再利用いたしません。
とのことですので、有効期限や重複の可能性は考えなくてよさそうです。
上記の大文字小文字の注意だけは必須ですね。
■SSL領域について
これは予想通りですが、SSL領域では、iモードIDは送付してこないので、サイト遷移的に工夫をする必要があります。
おそらく、iモードIDが必要になるのが、会員登録や商品購入、ログイン処理などだと思いますが、そういったページでSSLは必須ですので、肝心なところで使えません。
非SSL領域でiモードIDを取得し、それをセッションに格納してからSSLへ遷移し、SSL内ではセッションから取得という流れになるのではないかと思います。
SSL遷移中に非SSLに移動しiモードIDを取得という流れも考えられますが、端末側でSSL領域を抜けるメッセージが出たりするのでよくないかもしれません。