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的流程:每个用户,都只能有一个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去操作了;

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Android 开发,获取和保存 token 的方式因不同的业务需求而异,一般来说,获取 token 的方式是通过访问服务器接口,使用用户名和密码等身份验证信息,获取 token 字符串。而保存 token 的方式可以有多种,以下列出几种常用的方式: 1. SharedPreferences:使用 SharedPreferences 存储 token 字符串,可以方便地在应用程序进行读取和更新。示例代码如下: ```java // 保存 token SharedPreferences sp = getSharedPreferences("my_prefs", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("token", "your_token_string"); editor.apply(); // 读取 token String token = sp.getString("token", ""); ``` 2. 文件存储:将 token 字符串保存到应用程序的文件系统,可以使用 FileOutputStream 和 FileInputStream 等类进行读写操作。示例代码如下: ```java // 保存 token String filename = "token.txt"; String token = "your_token_string"; FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); fos.write(token.getBytes()); fos.close(); // 读取 token FileInputStream fis = openFileInput(filename); byte[] buffer = new byte[fis.available()]; fis.read(buffer); String token = new String(buffer); fis.close(); ``` 3. SQLite 数据库:使用 SQLite 数据库存储 token 字符串,可以支持更复杂的数据结构和查询操作。示例代码如下: ```java // 保存 token String token = "your_token_string"; MyDatabaseHelper dbHelper = new MyDatabaseHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("token", token); db.insert("token_table", null, values); // 读取 token SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("token_table", new String[] { "token" }, null, null, null, null, null); if (cursor.moveToFirst()) { String token = cursor.getString(cursor.getColumnIndex("token")); } cursor.close(); ``` 无论使用哪种方式保存 token,都应该注意安全性和有效期,避免 token 泄露和失效导致的安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值