モバイル開発におけるTokenの設計


目次
一:Token運用
二:Token実現プロセス
一:Token運用
1.appログインに成功し、tokenを生成します.
(1)tokenはファイルの形式で保存できます.
(2)apiインタフェースを呼び出すたびに比較されるため、サーバの圧力が増大するため、データベースに保存することは推奨されません.
(3)redisでtokenを保存し、推奨する.  
2.ログインに成功した後、サービス側はtokenに戻り、アンドロイドまたはiosにこのtokenを保存させ、その後、操作のたびにtokenを持ってインタフェースを要求する.
3.次に、それが私たちに伝えたtokenを比較し、一致すれば正常にデータを返します.そうしないと、appにこのtokenが一致していないと伝え、再ログインする必要があります.
二:Token実現プロセス
1.tokenを生成するプロセス:各ユーザーには、1つのtokenファイルしかありません.生成前に以前のtokenを削除し、冗長ファイルを回避します.
/*
 *   token
   *    token 
   */
private function get_token($userid){
   $token=$userid.'_'.MD5($userid.uniqid().rand(00000000,99999999)); //   
   $file_dir=APP_PATH.'token/'.$userid.'/';
   if(!@is_dir($file_dir)){
      @mkdir($file_dir,0777,true);
   }else{  //       token  
      $dir_token=scandir($file_dir);
      foreach($dir_token as $key => $value){
         if($value == '.' || $value == '..'){}else{
            unlink($file_dir.$value);
         }
      }
   }
   $fh = fopen($file_dir.$token,'w');
   fwrite($fh,serialize(array('time'=>time(),'token'=>$token,'userid'=>$userid))); //                 
   fclose($fh);
   return $token;
}


2.appリクエストのインタフェースから送られてきたtoken処理:時間が切れたかどうかを判断し、期限が切れていない場合は、時間を延長することを考慮してください.そうしないと、毎日ログインする場合があります.具体的なコードは以下の通りです.
このコード署名には、グローバル変数があります.
public $userid=0;

$token=trim($this->input->post('token'))
      if($token){
   //1  token      ,
   /*2.  :           2.1  :     token           2.2    :    id
    *3.   :      
    * */
   $maxtime=86400 * 7;//7       (    )
   $fcode = array();
          //$this->newtoken=$token;
   $user_id=strstr($token,"_",true);
   $file=APP_PATH.'token/'.$user_id.'/'.$token;
   if(file_exists($file)){ //1  
         $fh = @fopen($file,'r');
         $fcode = unserialize(@fread($fh,filesize($file)));
         @fclose($fh);
         if($fcode['time']+$maxtime < time()){ //   
            unlink($file);
            $this->userid=0;
         }else{  //    
            $this->userid=$fcode['userid'];
            $expire_time=86400 * 2;//               ,         ,        ,       
            if($fcode['time']+$expire_time < time()){
               $fh1 = fopen($file,'w');
               fwrite($fh1,serialize(array('time'=>time(),'token'=>$token,'userid'=>$fcode['userid'])));
               fclose($fh1);
            }
         }
   }else{
      $this->userid=0;
   }
   if($this->userid==0){

         exit( json_encode(array('code'=>'10000','msg'=>'    !')) );
      

   }
}

tokenでユーザーのuseridを取得することを実現し、useridで操作することができます.