ケータイサイトでの認証とかについて 実装「かんたんログイン」編
ケータイの個体識別番号(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向けとは違った対策が必要になってくる。
- php.ini で session.use_trans_sid = 1
- Cookieを使わなくても自動的にセッションidをサイト内リンクに付加する。
- ただし、コレだけだとセッションidの漏洩につながる。
- セッションidをページ更新のたびにセッションidを再生成する
- セッションid漏洩対策なのだが、ブラウザの「戻る」「進む」が使えなくなる。
- iモードidに依存することでセッションを管理しないという手も再考すべきかも
- すべてのリンクに"guid=ON"を埋め込むようにする。
セッションidの再生成
リクエストごとにセッションidを作り直すための関数をつくる。session_regenerate_id()で新しいセッションidと置き換えられるのだが、一筋縄ではいかないらしいので以下のようなコードを用意する。
セッションidを再生成するたびに、セッション情報を書き込むファイルがサーバーに溜まっていきます。なので古いセッション情報ファイルも削除します。
- cf)
<?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; } ?>
考慮しないといけないこと
- セッションidが漏洩しちゃう
- セッションID付きURLが Bot にインデックスされる等で、セッションID漏えい問題に対応したい - 基本へ帰ろう
- 検索エンジンのクローラがセッションid付きのURLを登録しちゃう
- 他のサイトへのリンクでリファラ経由でURL(セッションid付き)が渡ってしまう
- 自分の見ているページのURL(セッションid付き)を他人にメールで教えちゃう
- ソーシャルブックマークとかに登録しちゃう
- セッションID付きURLが Bot にインデックスされる等で、セッションID漏えい問題に対応したい - 基本へ帰ろう
- キャリアごとにCookieの挙動がちがうよ
- SSL通信まで考慮するともう大変
ケータイサイトでの認証とかについて 「かんたんログイン」
かんたんログイン
携帯キャリアが提供している個体識別番号を使っていわゆる「かんたんログイン」機能を作ることが出来ます。mixiとかはてなでも使っているアレです。UserAgentやらHTTP拡張ヘッダやらをいじらないといけないのでライブラリ(クラス)を作りました。PEAR::Net_UserAgent_Mobileでも使っておけば簡単なんです。
でも実際には、UAやらヘッダの話だけで済まないのがちょっと面倒です。NTTドコモ、KDDI、ソフトバンクモバイルの各社それぞれで異なる仕様で提供しています。
大雑把にいえば
- NTTドコモ
- リンクに仕込みを入れてやらないと取得できない。
- au KDDI
- ユーザーが設定さえしていれば常に取得できる。
- ソフトバンクモバイル
- ユーザーが設定さえしていれば常に取得できる。
ようするにドコモに合わせてページ遷移を考えろってこと。
細かくはこういう感じ
- NTTドコモ
- iモードID:HTTP拡張ヘッダ X-DCMGUID で値を受け取る。契約者に付随する番号。
- url引数にパラメータ"guid=ON"を与えてユーザーからのリクエストに紛れ込ませないといけない。
- iモードのiメニュー設定によってiモードidの通知の可否を設定する。ので設定していないユーザーに対しては不親切。(参照 nttdocomo.co.jp)
- 携帯製造番号&FOMAカード製造番号:HTTPヘッダ USER-AGENT 内に挿入されている。端末(ハードウェア)に付随する番号。
- iモードID:HTTP拡張ヘッダ X-DCMGUID で値を受け取る。契約者に付随する番号。
- au KDDI
- EZ番号(サブスクライバID):HTTP拡張ヘッダ X-UP-SUBNO で値を受け取る。契約者に付随する番号。
- 常に拡張ヘッダを送信している。
- auOneのお客様サポートから「申し込む/変更する」より通知設定をする。初期設定では「通知する」になっている。
- EZ番号(サブスクライバID):HTTP拡張ヘッダ X-UP-SUBNO で値を受け取る。契約者に付随する番号。
- ソフトバンクモバイル
- ユーザID:HTTP拡張ヘッダ X-JPHONE-UID で値を受け取る。契約者に付随する番号、たぶん。
- 3GシリーズからはユーザIDを使うことが出来る。
- ソフトバンクモバイルのサイトでは公開されていない。開発者向け情報としては一部提供されているか?ここ
- 常に拡張ヘッダを送信している。
- ユーザーID通知設定にて通知登録する。
- 端末シリアル番号:HTTPヘッダ USER-AGENT 内に挿入されている。端末(ハードウェア)に付随する番号。
- 3Gシリーズ以前の端末はこちらを使用する。
- 端末のユーザーID通知がONになっている必要がある。
- 通知設定がされていれば USER-AGENT内に常に挿入される。
- ユーザID:HTTP拡張ヘッダ X-JPHONE-UID で値を受け取る。契約者に付随する番号、たぶん。
Keitai_IP_List.class.php を更新
お前の予定!では、携帯のUserAgent判定にPEAR::Net_UserAgent_Mobileクラスをパクッた判定クラスを使っています。
この中にアクセス元がケータイからのipアドレスかどうかを判定するメソッド Keitai_Common::isValidIp() があります。ここで使用するipアドレスのリストを最新のものに更新しました。
携帯電話のキャリアがwebアクセスの際に使用するゲートウェイipアドレス帯域リストのURL
- http://www.nttdocomo.co.jp/service/imode/make/content/ip/
- KDDI au: 技術情報 > IPアドレス帯域
- http://creation.mb.softbank.jp/web/web_ip.html
- サービス|Y!mobile - 格安SIM・スマホはワイモバイルで
Keitai.class の対応外だがイーモバイルについて
お前の予定!とは
お前の予定!ToDo.oboetel.com
携帯電話むけのリマインダーです。
メールを送信してToDoを登録します。
携帯電話の固有番号(UID)を登録する必要があります。
メモ日記にも
これからの予定としてだけでなく、メモを記録することも出来ます。
日付を指定せずにToDoを登録すれば、単なるメモとして保存します。
リマインダーとして
メールの件名(サブジェクト)に日付と時刻を書いて送れば、指定された時刻にお知らせメールをあなたのアドレスに送信します。
誰かのスケジュールも勝手にリマインダー
自分だけでなく友だちにも予定を送ること出来ます。
メール本文に一緒に予定を送りたい友だちのメールアドレスを書くだけで、友だちにも同じリマインダーを送れます。