日韩精品成人无码专区免费-国产99久久久久久免费看-国产精品丝袜久久久久久不卡-国产精品无码一区二区三区

php如何設置 token

發布時間:2024-05-11 點擊:195
php設置token的方法:首先定義獲取token的路由路徑;然后建立service層;接著在model層里建立user類,并在驗證器類和異常類創建相應的驗證方法和異常處理;最后完成token令牌的編寫即可。
推薦:《php視頻教程》
我們開發的后端api接口會對訪問者有一個權限要求,比如一些包含私人信息的接口,就需要訪問者請求接口的同時,傳遞一個提前已經發放給訪問者的token。
這就像一個令牌一樣,只有訪問者展示出來我們才會“通過放行”。
下面就記錄一下權限令牌的代碼編寫思路。
一、流程概要
定義獲取token的路由路徑,接受code參數(code來源:微信服務器,登錄系統基于微信體系)
建立service層,在這層里創建token基類和usertoken類
usertoken類處理整個邏輯:token生成和返回
在model層里建立user類,負責用戶數據表的讀寫,供service層的usertoken調用
在驗證器類和異常類創建相應的驗證方法和異常處理
控制器->service層->model層返回值給service層->service層返回值給控制器,整個流程完成token令牌的編寫
二、具體說明
首先定義好路由路徑:
route::post( 'api/:version/token/user', 'api/:version.token/gettoken');然后創建token控制器,定義對應路由路徑的gettoken方法:
public function gettoken($code='') { (new tokenget())->gocheck($code); // 驗證器 $token = (new usertoken($code))->get(); return [ 'token' => $token ]; }在調用service層之前,還得檢查一下傳遞過來的參數,于是定義tokenget這個驗證器:
class tokenget extends basevalidate{ protected $rule = [ 'code' => 'require|isnotempty' ]; protected $message = [ 'code' => '需要code才能獲得token!' ]; }回到token控制器,驗證通過后,我們調用service層定義的usertoken類:
$token = (new usertoken($code))->get();這里討論一下service層和model層。我們普遍的理解是service層是基于model層的一次抽象封裝。
model層只負責操作數據庫并返且返回給service層
然后service層處理業務邏輯,最后返回給controller層
但我覺得小項目的話,service其實和model就有點平級的意思,因為有些簡單的接口model層直接對接controller就可以了,只有相對復雜的接口,比如用戶權限,就可以再經過service層分隔不同功能的代碼。
這樣的處理更加靈活,有大量確實很簡單的接口就不用過一次service層了,這樣更像是走過過場而已,沒什么意義了。
回到service層的代碼編寫,由于token還會有不同的種類,所以先創建一個token基類,里面包含一些通用的方法。然后就是給訪問者返回令牌的usertoken類的編寫了。
由于是基于微信,我們需要三個信息:code,appid,appsecret,然后通過構造函數來給usertoken類賦上初始值:
function __construct($code) { $this->code = $code; $this->wxappid = config('wx.app_id'); $this->wxappsecret = config('wx.app_secret'); $this->wxloginurl = sprintf( config('wx.login_url'), $this->wxappid, $this->wxappsecret, $this->code ); }然后把這三個放入微信提供的接口的參數位置,目的是獲得一個完整的微信服務器端的url,請求到我們需要的openid。
然后是通過發送網絡請求的步驟就在此略過。微信服務器會返回包含openid的對象,判斷這個對象的值沒問題后,我們就開始生成令牌的步驟了,創建函數granttoken():
private function granttoken($openidobj) { // 取出openid $openid = $openidobj['openid']; // 通過model層調用數據庫,檢查openid是否已經存在 $user = usermodel::getbyopenid($openid); // 如果存在,不處理,反之則新增一條user記錄 if ($user) { $uid = $user->id; } else { // 不存在,生成一條數據,具體方法略過 $uid = $this->newuser($openid); } // 生成令牌,寫入緩存(具體方法見下面的定義) $cachedvalue = $this->preparecachevalue($openidobj, $uid); $token = $this->savetocache($cachedvalue); // 令牌返回到調用者端 return $token;} private function preparecachevalue($openidobj, $uid) { $cachedvalue = $openidobj; $cachedvalue['uid'] = $uid; $cachedvalue['scope'] = 16; // 權限值,自己定義 return $cachedvalue;} private function savetocache($cachedvalue) { $key = self::generatetoken(); // 生成令牌的方法 $value = json_encode($cachedvalue); $tokenexpire = config('setting.token_expire'); // 設定的過期時間 $request = cache($key, $value, $tokenexpire); if (!$request) { throw new tokenexception([ 'msg' => '服務器緩存異常', 'errorcode' => 10005 ]); } return $key; // 返回令牌:token}可以看到,核心流程就是:
拿到openid
查看數據庫,檢查openid是否已經存在
如果存在,不處理,反之則新增一條user記錄
生成令牌,準備緩存數據,寫入緩存
把令牌返回到客戶端去
其中generatetoken()這個方法詳細定義如下:
public static function generatetoken() { $randomchars = getrandomchars(32); // 32個字符組成一組隨機字符串 $timestamp = $_server['request_time_float']; $salt = config('security.token_salt'); // salt 鹽 // 拼接三組字符串,進行md5加密,然后返回 return md5($randomchars.$timestamp.$salt);} function getrandomchars($length) { $str = null; $strpo

金鴿云物聯網云平臺助力小微企業快速搭建自己的工業物聯網云平臺
ecs云服務器能掛游戲嗎
用不了域名是在萬網購買的
阿里云服務器秒殺是什么
阿里云服務器低價購買
買個域名多少錢
空間與云服務器價格
美團十年,為何總是偏愛拼音域名?