国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

php如何設(shè)置權(quán)限令牌token

來源:懂視網(wǎng) 責編:小采 時間:2020-11-02 18:27:20
文檔

php如何設(shè)置權(quán)限令牌token

php如何設(shè)置權(quán)限令牌token:php設(shè)置token的方法:1、定義獲取Token的路由路徑;2、建立Service層;3、使用UserToken類處理整個邏輯;4、在Model層里建立User類;5、在驗證器類和異常類創(chuàng)建相應(yīng)的驗證方法和異常處理。推薦:《PHP視頻教程》PHP_設(shè)置權(quán)限令牌Token我們開發(fā)的后端
推薦度:
導(dǎo)讀php如何設(shè)置權(quán)限令牌token:php設(shè)置token的方法:1、定義獲取Token的路由路徑;2、建立Service層;3、使用UserToken類處理整個邏輯;4、在Model層里建立User類;5、在驗證器類和異常類創(chuàng)建相應(yīng)的驗證方法和異常處理。推薦:《PHP視頻教程》PHP_設(shè)置權(quán)限令牌Token我們開發(fā)的后端

php設(shè)置token的方法:1、定義獲取Token的路由路徑;2、建立Service層;3、使用UserToken類處理整個邏輯;4、在Model層里建立User類;5、在驗證器類和異常類創(chuàng)建相應(yīng)的驗證方法和異常處理。

推薦:《PHP視頻教程》

PHP_設(shè)置權(quán)限令牌Token

我們開發(fā)的后端API接口會對訪問者有一個權(quán)限要求,比如一些包含私人信息的接口,就需要訪問者請求接口的同時,傳遞一個提前已經(jīng)發(fā)放給訪問者的Token。

這就像一個令牌一樣,只有訪問者展示出來我們才會“通過放行”。

下面就記錄一下權(quán)限令牌的代碼編寫思路。


一、流程概要

  • 定義獲取Token的路由路徑,接受code參數(shù)(code來源:微信服務(wù)器,登錄系統(tǒng)基于微信體系)

  • 建立Service層,在這層里創(chuàng)建Token基類和UserToken類

  • UserToken類處理整個邏輯:Token生成和返回

  • 在Model層里建立User類,負責用戶數(shù)據(jù)表的讀寫,供Service層的UserToken調(diào)用

  • 在驗證器類和異常類創(chuàng)建相應(yīng)的驗證方法和異常處理

  • 控制器->Service層->Model層返回值給Service層->Service層返回值給控制器,整個流程完成Token令牌的編寫

  • 二、具體說明

    首先定義好路由路徑:

    Route::post(
     'api/:version/token/user',
     'api/:version.Token/getToken'
    );

    然后創(chuàng)建Token控制器,定義對應(yīng)路由路徑的getToken方法:

    public function getToken($code='') {
     (new TokenGet())->goCheck($code); // 驗證器
     $token = (new UserToken($code))->get();
     return [
     'token' => $token
     ];
     }

    在調(diào)用Service層之前,還得檢查一下傳遞過來的參數(shù),于是定義TokenGet這個驗證器:

    class TokenGet extends BaseValidate
    {
     protected $rule = [
     'code' => 'require|isNotEmpty'
     ];
    
     protected $message = [
     'code' => '需要code才能獲得Token!'
     ];
     }

    回到Token控制器,驗證通過后,我們調(diào)用Service層定義的UserToken類:

    $token = (new UserToken($code))->get();復(fù)制代碼

    這里討論一下Service層和Model層。我們普遍的理解是Service層是基于Model層的一次抽象封裝。

  • Model層只負責操作數(shù)據(jù)庫并返且返回給Service層
  • 然后Service層處理業(yè)務(wù)邏輯,最后返回給Controller層
  • 但我覺得小項目的話,Service其實和Model就有點平級的意思,因為有些簡單的接口Model層直接對接Controller就可以了,只有相對復(fù)雜的接口,比如用戶權(quán)限,就可以再經(jīng)過Service層分隔不同功能的代碼。

    這樣的處理更加靈活,有大量確實很簡單的接口就不用過一次Service層了,這樣更像是走過過場而已,沒什么意義了。

    回到Service層的代碼編寫,由于Token還會有不同的種類,所以先創(chuàng)建一個Token基類,里面包含一些通用的方法。然后就是給訪問者返回令牌的UserToken類的編寫了。

    由于是基于微信,我們需要三個信息:code,appid,appsecret,然后通過構(gòu)造函數(shù)來給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
     );
     }

    然后把這三個放入微信提供的接口的參數(shù)位置,目的是獲得一個完整的微信服務(wù)器端的url,請求到我們需要的openid。

    然后是通過發(fā)送網(wǎng)絡(luò)請求的步驟就在此略過。微信服務(wù)器會返回包含openid的對象,判斷這個對象的值沒問題后,我們就開始生成令牌的步驟了,創(chuàng)建函數(shù)grantToken():

    private function grantToken($openidObj) {
    
     // 取出openid
     $openid = $openidObj['openid'];
     
     // 通過Model層調(diào)用數(shù)據(jù)庫,檢查openid是否已經(jīng)存在
     $user = UserModel::getByOpenID($openid);
     
     // 如果存在,不處理,反之則新增一條user記錄
     if ($user) {
     $uid = $user->id;
     } else {
     // 不存在,生成一條數(shù)據(jù),具體方法略過
     $uid = $this->newUser($openid); 
     }
     
     // 生成令牌,寫入緩存(具體方法見下面的定義)
     $cachedValue = $this->prepareCacheValue($openidObj, $uid);
     $token = $this->saveToCache($cachedValue);
     
     // 令牌返回到調(diào)用者端
     return $token;
    }
    
    private function prepareCacheValue($openidObj, $uid) {
     $cachedValue = $openidObj;
     $cachedValue['uid'] = $uid;
     $cachedValue['scope'] = 16; // 權(quán)限值,自己定義
     return $cachedValue;
    }
     
    private function saveToCache($cachedValue) {
     $key = self::generateToken(); // 生成令牌的方法
     $value = json_encode($cachedValue);
     $tokenExpire = config('setting.token_expire'); // 設(shè)定的過期時間
    
     $request = cache($key, $value, $tokenExpire);
     if (!$request) {
     throw new TokenException([
     'msg' => '服務(wù)器緩存異常',
     'errorCode' => 10005
     ]);
     }
     return $key; // 返回令牌:token
    }

    可以看到,核心流程就是:

  • 拿到openid
  • 查看數(shù)據(jù)庫,檢查openid是否已經(jīng)存在
  • 如果存在,不處理,反之則新增一條user記錄
  • 生成令牌,準備緩存數(shù)據(jù),寫入緩存
  • 把令牌返回到客戶端去
  • 其中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;
     $strPoll = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
     $max = strlen($strPoll) - 1;
    
     for ($i = 0; $i < $length; $i++) {
     $str .= $strPoll[rand(0, $max)];
     }
     return $str;
    }

    它的主要作用毫無疑問就是生成我們的需要的令牌——Token字符串。值得一提的是由于generateToken()在其他類型的Token里也會用到,所以是放在Token基類里的。

    至此,只需要把生成的令牌再返回到Controller就行了。

    三、總結(jié)

    令牌的編寫涉及到很多的流程,為了避免混亂,一定要注意把負責不同工作的代碼分別定義在不同的方法里。就像上面例子里grantToken()方法體現(xiàn)的那樣,這是個核心方法,包含所有流程,但是不同的具體流程又定義在其他方法里,然后提供給grantToken()方法調(diào)用。

    這樣做之后grantToken()方法即使包含所有流程,但也依然很容易閱讀。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    php如何設(shè)置權(quán)限令牌token

    php如何設(shè)置權(quán)限令牌token:php設(shè)置token的方法:1、定義獲取Token的路由路徑;2、建立Service層;3、使用UserToken類處理整個邏輯;4、在Model層里建立User類;5、在驗證器類和異常類創(chuàng)建相應(yīng)的驗證方法和異常處理。推薦:《PHP視頻教程》PHP_設(shè)置權(quán)限令牌Token我們開發(fā)的后端
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 成人一级免费视频 | 成年全黄大色大黄 | 亚洲视频欧美视频 | 一级毛片不收费 | 欧美国产高清 | 伊人久久精品成人网 | 国内精品免费 | 久久国产成人精品国产成人亚洲 | 欧美在线视频一区二区三区 | 欧美成人精品第一区二区三区 | 全免费a级毛片免费看不卡 青青色在线视频 | 精品久久久久久久中文字幕 | 亚洲精品视频在线观看免费 | 亚洲欧洲高清有无 | 欧美日韩另类国产 | 久久精品国产亚洲a不卡 | 欧美视频免费看 | 最刺激黄a大片免费观看 | 九九久久香港经典三级精品 | 久久久久久国产精品免费 | 免费国产精品视频 | 99久久综合国产精品免费 | 欧美在线视频 一区二区 | 国产一二三区在线 | 337p日本欧洲亚洲大胆精品 | 精品国产免费人成在线观看 | 日韩在线观看视频免费 | 亚洲国产 | 91久久国产口精品久久久久 | 精品国产一区二区在线观看 | 日韩欧美精品综合一区二区三区 | 中文字幕另类 | 久久er| 欧美日韩精品一区二区三区四区 | 欧美一区二区三区免费高 | 日韩网址 | 欧美精品一区二区三区免费播放 | 成人欧美精品久久久久影院 | 黄色a一级视频 | 四虎影院永久免费 | 亚洲国产一区二区三区在线观看 |