App介面設計之token的php實現
App介面設計之token的php實現
為了保證移動端和服務端資料傳輸相對安全,需要對介面進行加密傳輸。
一、token的設計目的:
因為APP端沒有和PC端一樣的session機制,所以無法判斷使用者是否登陸,以及無法保持使用者狀態,所以就需要一種機制來實現session,這就是token的作用
token是使用者登陸的唯一票據,只要APP傳來的token和伺服器端一致,就能證明你已經登陸(就和你去看電影一樣,需要買票,拿著票就能進了)
二、token設計時的種類:
(1)第三方登陸型:
這種token形如微信的access_token,設計原理是按照OAuth2.0來的,其特點是定時重新整理(比如兩小時重新整理)
(2)APP自用登陸型:
這種token就是一般的APP用的token,因為不經過第三方,而是使用者直接取資料來源伺服器資料,所以設計比較隨意,只需要保證其token的唯一性就行。
三、APP自用登陸型token實現步驟:
(1)資料庫使用者表新增token欄位和time_out這個token過期時間欄位
(2)使用者登陸時(註冊時自動登陸也需要)生成一個token和過期時間存入表中
(3)在其他介面呼叫前,判斷token是否正確,正確則繼續,錯誤則讓使用者重新登陸
四、APP自用登陸型token實現程式碼(公司自用框架及邏輯,主要看邏輯,不要直接複製程式碼):
(1)下面是使用者登陸時把token插入資料庫的程式碼
$logininfo['token'] = appuser::settoken();
$time_out = strtotime("+7 days");
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錯誤驗證失敗
}