ケータイサイトでの認証とかについて 実装「かんたんログイン」編

ケータイの個体識別番号(uid)が欲しい場合、NTTドコモではurlの引数に"guid=ON"をつけなくてはいけない。認証をする時には必ず指定する。

<a href="actionLogin.php?guid=ON">ログイン</a>
UserAgentの判定

uidの取得方法が携帯キャリアによって異なるので、uidを使うときにはUserAgentの判定も同時におこないます。
PEAR::Net_UserAgent_Mobileを使うのが楽です。

<?php
require_once('Net/UserAgent/Mobile.php');
$agent = Net_UserAgent_Mobile::factory();
$uid = $agent->getUID();
if ( is_null($uid) && $agent->isSoftBank() ) {
   $uid = $agent->getSerialNumber();
}
?>

iモードIDだけを使うことを前提にすると、コレだけでuidを取得できます。だた、ソフトバンクではHTTP拡張ヘッダX-JPHONE-UIDを送らない機種もあるのでちょっとスマートじゃないですね。

お前の予定!では学習目的に書き起こしました。UserAgentのキャリア判定を自動にして共通のメソッドgetKeitaiId()で「識別する番号(uidもしくは端末製造番号)」を取得できるようにしました。

<?php
require_once('Keitai.class.php');
$ua = Keitai::factory();
$uid = $ua->getKeitaiId();
?>

ケータイサイトでの認証とかについて 「セッション」

セッション

ケータイサイトでの認証とかについて 「かんたんログイン」 - お前の予定!! 日記 では、NTTドコモの仕様に合わせてページ遷移を考えればよいと書いたのですが、すべてのリンクに"guid=ON"と書くのはイマイチ感があったりする。
ケータイ専用に作ってしまえばそれでイイのかもしれないけど、同じページをPCにも出したいなとか欲張るとセッションをつかってなんとかしたいなとか思います。

google:セッション管理の概要についてはグーグル先生におまかせするとして。ケータイ向けにセッションを使おうとするとCookieが使えないので、PC向けとは違った対策が必要になってくる。

  1. php.ini で session.use_trans_sid = 1
    • Cookieを使わなくても自動的にセッションidをサイト内リンクに付加する。
    • ただし、コレだけだとセッションidの漏洩につながる。
  2. セッションidをページ更新のたびにセッションidを再生成する
    • セッションid漏洩対策なのだが、ブラウザの「戻る」「進む」が使えなくなる。
  3. iモードidに依存することでセッションを管理しないという手も再考すべきかも
    • すべてのリンクに"guid=ON"を埋め込むようにする。
セッションidの再生成

リクエストごとにセッションidを作り直すための関数をつくる。session_regenerate_id()で新しいセッションidと置き換えられるのだが、一筋縄ではいかないらしいので以下のようなコードを用意する。
セッションidを再生成するたびに、セッション情報を書き込むファイルがサーバーに溜まっていきます。なので古いセッション情報ファイルも削除します。

<?php
    function sessionRegenerate() {
        $tmp = $_SESSION;
        $old_id = session_id();
        session_destroy();
        session_start();
        session_regenerate_id(true);
        $old_session_file = session_save_path()."/sess_".$old_id;
        if ( file_exists($old_session_file) ) unlink($old_session_file);
        $_SESSION = $tmp;
    }
?>
考慮しないといけないこと
  1. セッションidが漏洩しちゃう
  2. キャリアごとにCookieの挙動がちがうよ
  3. SSL通信まで考慮するともう大変

ケータイサイトでの認証とかについて 「かんたんログイン」

かんたんログイン

携帯キャリアが提供している個体識別番号を使っていわゆる「かんたんログイン」機能を作ることが出来ます。mixiとかはてなでも使っているアレです。UserAgentやらHTTP拡張ヘッダやらをいじらないといけないのでライブラリ(クラス)を作りました。PEAR::Net_UserAgent_Mobileでも使っておけば簡単なんです。

でも実際には、UAやらヘッダの話だけで済まないのがちょっと面倒です。NTTドコモKDDIソフトバンクモバイルの各社それぞれで異なる仕様で提供しています。
大雑把にいえば

  1. NTTドコモ
    • リンクに仕込みを入れてやらないと取得できない。
  2. au KDDI
    • ユーザーが設定さえしていれば常に取得できる。
  3. ソフトバンクモバイル
    • ユーザーが設定さえしていれば常に取得できる。

ようするにドコモに合わせてページ遷移を考えろってこと。

細かくはこういう感じ
  1. NTTドコモ
    • iモードID:HTTP拡張ヘッダ X-DCMGUID で値を受け取る。契約者に付随する番号。
      • url引数にパラメータ"guid=ON"を与えてユーザーからのリクエストに紛れ込ませないといけない。
      • iモードのiメニュー設定によってiモードidの通知の可否を設定する。ので設定していないユーザーに対しては不親切。(参照 nttdocomo.co.jp)
    • 携帯製造番号&FOMAカード製造番号:HTTPヘッダ USER-AGENT 内に挿入されている。端末(ハードウェア)に付随する番号。
      • <a>タグの属性として"utn"を指定することでユーザーからのリクエストに紛れ込ませないといけない。
      • utnでリクエストをする度にユーザーに対して送信確認のダイアログが表示される。鬱陶しいよね?
  2. au KDDI
  3. ソフトバンクモバイル
    • ユーザID:HTTP拡張ヘッダ X-JPHONE-UID で値を受け取る。契約者に付随する番号、たぶん。
      • 3GシリーズからはユーザIDを使うことが出来る。
      • ソフトバンクモバイルのサイトでは公開されていない。開発者向け情報としては一部提供されているか?ここ
      • 常に拡張ヘッダを送信している。
      • ユーザーID通知設定にて通知登録する。
    • 端末シリアル番号:HTTPヘッダ USER-AGENT 内に挿入されている。端末(ハードウェア)に付随する番号。
      • 3Gシリーズ以前の端末はこちらを使用する。
      • 端末のユーザーID通知がONになっている必要がある。
      • 通知設定がされていれば USER-AGENT内に常に挿入される。

Keitai_IP_List.class.php を更新

お前の予定!では、携帯のUserAgent判定にPEAR::Net_UserAgent_Mobileクラスをパクッた判定クラスを使っています。
この中にアクセス元がケータイからのipアドレスかどうかを判定するメソッド Keitai_Common::isValidIp() があります。ここで使用するipアドレスのリストを最新のものに更新しました。

携帯電話のキャリアがwebアクセスの際に使用するゲートウェイipアドレス帯域リストのURL

ドキュメンテーション作業メモ 比較して書いてみよう

おまけ

お前の予定!とは

お前の予定!ToDo.oboetel.com
携帯電話むけのリマインダーです。
メールを送信してToDoを登録します。

携帯電話の固有番号(UID)を登録する必要があります。

メモ日記にも

これからの予定としてだけでなく、メモを記録することも出来ます。
日付を指定せずにToDoを登録すれば、単なるメモとして保存します。

リマインダーとして

メールの件名(サブジェクト)に日付と時刻を書いて送れば、指定された時刻にお知らせメールをあなたのアドレスに送信します。

誰かのスケジュールも勝手にリマインダー

自分だけでなく友だちにも予定を送ること出来ます。
メール本文に一緒に予定を送りたい友だちのメールアドレスを書くだけで、友だちにも同じリマインダーを送れます。

お前の予定!の使い方 日記編

  1. お前の予定!に「かんたんログイン」します。
    • 予め携帯固有番号を登録する必要があります。登録ページ
  2. 「メールで新規追加」をクリックするとメールの入力画面になります。
    • 件名に日記のタイトル
    • 本文に日記の内容を書きます
  3. しばらくすると登録確認のメールが届きます。
    • info@t.oboetel.com からのメールを受信できるように設定してください。
  4. お前の予定!に登録されています。