携帯はとにかく文字入力がめんどくさい。
だから、ログインも自動で行いたい。よくある「かんたんログイン」とか「自動ログイン」とかだね。
だから、ログインも自動で行いたい。よくある「かんたんログイン」とか「自動ログイン」とかだね。
かんたんログインの仕組みとしては、
- 事前に携帯から送信される携帯(もしくは契約者)固有の情報を取得しておき、
- 次回からは、それを元に認証を行う
携帯の機種にもよるけど、今回は、
・全機種は工数かかるから、比較的最近の機種(FOMA、WAP2.0、3G以降くらいを目安)で
・もちろん勝手サイト
を前提に。
1に関して、携帯端末固有の情報より契約者(ユーザー)固有の情報のほうが、機種変にもつよいので契約者固有の情報(以下UID)をとることにする。
取り方:
Net_UserAgent_MobileというモジュールのgetUIDを使う。AUとSoftbankはこれで取れる。Docomoに関しては、URLにguid=onというクエリストリングをつけてやらないと取れない。かつ、SSLでも取れない。
SSLで使いたいねん!という人はiモードIDとutn(端末情報)との違いで提案されている、リダイレクトをかました構成などを試してみるといいかもしれない。
2に関して、、、これはZend FrameworkのZend_Authを使っている人にしか当てはまらないけど、Zend_Auth_Adapter_DbTable::authenticateはIDとパスワードのセットを引数にとるので、uidだけだと通らない。とはいえ、フレームワークを書き換えるのは未来のデグレの種になるし、セッション管理のことを考えると、別の仕組みで認証通すのもめんどくさい。
ということで、この状況に対応するには以下の2ステップでいける。
・事前にUIDを元に、ユーザー情報を引っ張っておく
・パスワードがハッシュ化されているので、ハッシュ化をかまさない認証口を用意しておく
具体的には、こんな感じ(抜粋)。あまりキレイとも思ってないので、アドバイスあったらください。
$db = Hmr_Db_Connector::getConnection();
$users = new Users();
//事前にユーザー情報を引っ張っておく。
if($isMobile === 'easy'){
//$loginIdはUID
$row = $users->authenticateByUID($loginId);
$stateName = 'mobile_state';
}else{
$row = $users->authenticate($loginId, $password);
$stateName = 'state';
}
if($row){
$adapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'id', 'crypted_password');
$adapter->setIdentity($row['user_id']);
if($isMobile === 'easy'){
// こっちは、ハッシュ化されているデータを元に認証するので、ハッシュ化しない。
$adapter->setCredential($row->crypted_password)->
setCredentialTreatment(" and " .$stateName. " = 'activated'");
}else{
// こっちは普通のIDとパスワードでの認証なので、ハッシュ化する。
$adapter->setCredential($password)->
setCredentialTreatment("encode(digest(? || users.salt, 'sha256'), 'hex') and " .$stateName. " = 'activated'");
}
$result = $auth->authenticate($adapter);
if($result->isValid()){
//ユーザー情報をセッションに保存。
$auth->getStorage()->write($adapter->getResultRowObject(array('id', 'email', 'nickname'), null));
$bool = true;
}
}
なお、いずれのキャリアも、ユーザー側の設定で、契約者固有の情報を送信しない設定にできるので、必ずしも送られてくるわけじゃないことを念頭にプログラムを組む必要があるよ。
コメントする