App接口設計之token的php實現

爲了保證移動端和服務端數據傳輸相對安全,須要對接口進行加密傳輸。數據庫

1、ttoken的設計目的: 

由於APP端沒有和PC端同樣的session機制,因此沒法判斷用戶是否登錄,以及沒法保持用戶狀態,因此就須要一種機制來實現session,這就是token的做用json

 

token是用戶登錄的惟一票據,只要APP傳來的token和服務器端一致,就能證實你已經登錄(就和你去看電影同樣,須要買票,拿着票就能進了)安全

 

2、token設計時的種類: 

(1)第三方登錄型:
   這種token形如微信的access_token,設計原理是按照OAuth2.0來的,其特色是 定時刷新(好比兩小時刷新),目的是由於數據源將登錄權限賦予第三方服務器時必需要控制其有效期和權限,要否則第三方服務器能夠不通過用戶贊成,無限期從數據源服務器獲取用戶任意數據。
 
(2)APP自用登錄型:
  這種token就是通常的APP用的token,由於不通過第三方,而是用戶直接取數據源服務器數據,因此設計比較隨意,只須要保證其token的惟一性就行。
 
3、APP自用登錄型token實現步驟: 

(1)數據庫用戶表添加token字段time_out這個token過時時間字段 服務器

(2)用戶登錄時(註冊時自動登錄也須要)生成一個token和過時時間存入表中 微信

(3)在其餘接口調用前判斷token是否正確,正確則繼續,錯誤則讓用戶從新登錄session

 

4、APP自用登錄型token實現代碼(公司自用框架及邏輯,主要看邏輯,不要直接複製代碼):app

(1)下面是用戶登錄時把token插入數據庫的代碼框架

  $logininfo['token'] = appuser::settoken();加密

  $time_out = strtotime("+7 days");spa

  db::setByPk('u_adver', array('token1' => $logininfo['token'], 'time_out' => $time_out), $logininfo['id']);

(2)//下面是生成token方法代碼

    public static function settoken(){

          $str = md5(uniqid(md5(microtime(true)),true));  //生成一個不會重複的字符串

          $str = sha1($str);  //加密

          return $str;

      }

 (3)下面是每一個接口都必須調用的token驗證代碼,驗證具體實現是在(4)

  $args['token'] = $_POST['token'];

  $tokencheck = appuser::checktokens($args['token'], 'u_adver');

        if ($tokencheck != 90001) {

            $res['msg_code'] = $tokencheck;

            v_json($res);

        }

(4)token驗證方法,db::是數據庫操做類,這裏設置是token若是七天沒被調用則須要從新登錄(也就是說用戶7天沒有操做APP則須要從新登錄),若是某個接口被調用,則會從新刷新過時時間

   public static function checktokens($token, $table){

          $res = db::getOneForFields($table, 'time_out', 'token1 = ?', array($token));

          if (!empty($res)) {

                if (time() - $res['time_out'] > 0) {

                    return 90003;  //token長時間未使用而過時,需從新登錄

                }

                $new_time_out = time() + 604800;//604800是七天

                if (db::setWhere($table, array('time_out' => $new_time_out), 'token1 = ?', array($token))) {

                    return 90001;  //token驗證成功,time_out刷新成功,能夠獲取接口信息

               }

          }

          return 90002;  //token錯誤驗證失敗

     }

相關文章
相關標籤/搜索