2009年12月22日

phpでdocomo携帯のguidを自動取得

スマートフォン以外のモバイル環境では、まだCookieを使えないことが多く、
webページのセッションを維持するにはCookieに頼らない手法が必要です。
その代わり、契約会社がユーザーに割り振っている固有IDを使うことで、
「簡単ログイン」のようにパスワード入力を省略した認証を作ることができます。
こちらに各キャリアのUID情報をまとめた詳しい表があります。

IDには数種類あり、送信に確認が必要なIDもありますが、
ページを移る度に確認が必要なのはさすがにメンドウです。
幸いdocomo, au, softbank各社とも送信確認不要のIDが用意されています。
これらはphpでは

・docomo
$_SERVER['HTTP_X_DCMGUID']
・au
$_SERVER['HTTP_X_UP_SUBNO']
・softbank
$_SERVER['HTTP_X_JPHONE_UID']

で取得することができます。
※ただしユーザーがIDの送信をOFFに設定していると取得できません。


ところでdocomoの場合、urlの中に必ず"guid=ON"というパラメーターが
入っていないとUIDが送信されないようになっています。
そこで、認証機能が必要なページは全て"guid=ON"を付けることになります。
しかし"guid=ON"でないようなアクセスがある場合もありうるので、
その場合に自動的にリロードするようなphpプログラムを書きました。
ただしリロードするので基本的にPOST変数を受けるページでは使えません。

require_once 'HTTP.php'; //urlのリダイレクトに必要

function reloadWithGuid()
{
if ($_GET['guid'] != 'ON')
{
$uri = setQuery('guid', 'ON');
HTTP::redirect($uri);
}
}

この中で、setQuery()という関数は、urlパラメーターのGET変数に
値をセットする自前の関数です(使用、再配布自由です)。
  1. 書き換えたい変数が?var=, &var=のどちらの形でも使える
  2. すでに同じ名前の変数があれば上書きする
  3. 他の変数に影響を与えないようにする
という条件が満たされるようにしています。

/*
 * @create 09.12.16
 * @author mimori @ RAXUS.Co.Ltd.
 * @param $name 変数名
 * @param $value
 * @param $uri 指定なしなら現在のURIを使う
 * @return 新しいuri
 * @brief uriのget値の$nameを$valueにする。元のuriのvalidationは考慮せず。
 */

function setQuery($name, $value, $uri = "")
{
//$uri指定がなかった場合現在のuriを使う
if ($uri == "") $uri = $_SERVER['REQUEST_URI'];

//ベース部とクエリー部に分け、各name=valueを取り出す
list ($uri_base, $uri_query) = explode('?', $uri);
$params = explode('&', $uri_query);

//空白でなくかつ$nameと一致していない変数だけ残す
$new_params = array();
foreach ($params as $param)
{
list($n, $v) = explode('=', $param);
if ($n && $n != $name) $new_params[] = $param;

//新しい$name=$valueのセット
$new_params[] = $name. '='. $value;

//uriに戻す
return $uri_base. '?'. implode('&', $new_params);
}

セッションが使えない場合、GET値で値を維持したいことが多いので
意外と使い出があると思います。

*urlエンコードはされません。
*正規表現をフル活用すればより短く速くなる気もします。




ラベル:leopard
posted by ラクサス at 08:32| Comment(0) | TrackBack(0) | 【プログラミング】PHP編 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。