Zend Frmaeworkで携帯サイトを作る(PCサイトを作った後で)6-かんたんログイン(自動ログイン)

| | コメント(0) | トラックバック(0)
携帯はとにかく文字入力がめんどくさい。
だから、ログインも自動で行いたい。よくある「かんたんログイン」とか「自動ログイン」とかだね。



 かんたんログインの仕組みとしては、
  1. 事前に携帯から送信される携帯(もしくは契約者)固有の情報を取得しておき、
  2. 次回からは、それを元に認証を行う
という、大まかには2ステップしかない。

携帯の機種にもよるけど、今回は、
・全機種は工数かかるから、比較的最近の機種(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;
            }
        }

なお、いずれのキャリアも、ユーザー側の設定で、契約者固有の情報を送信しない設定にできるので、必ずしも送られてくるわけじゃないことを念頭にプログラムを組む必要があるよ。


トラックバック(0)

このブログ記事を参照しているブログ一覧: Zend Frmaeworkで携帯サイトを作る(PCサイトを作った後で)6-かんたんログイン(自動ログイン)

このブログ記事に対するトラックバックURL: http://hirop0164.s326.xrea.com/mt/mt-tb.cgi/264

コメントする


画像の中に見える文字を入力してください。

ブックマーク

はてなブックマークに追加 Yahoo!ブックマークに登録 del.icio.us に登録 ライブドアクリップに追加 Google Bookmarks に追加

Ajax: 2009年5月: 月別アーカイブ

このブログ記事について

このページは、ぴろしが2009年2月19日 15:01に書いたブログ記事です。

ひとつ前のブログ記事は「new Zend_Date()で[notice] child pid xxxx exit signal Segmentation fault (11)」です。

次のブログ記事は「exception 'Zend_Db_Table_Row_Exception' with message 'This row has been marked read-only' in 」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。