<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

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

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

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

        推薦:《PHP視頻教程》

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

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

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

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


        一、流程概要

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

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

      3. UserToken類處理整個(gè)邏輯:Token生成和返回

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

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

      6. 控制器->Service層->Model層返回值給Service層->Service層返回值給控制器,整個(gè)流程完成Token令牌的編寫

      7. 二、具體說明

        首先定義好路由路徑:

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

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

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

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

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

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

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

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

      8. Model層只負(fù)責(zé)操作數(shù)據(jù)庫并返且返回給Service層
      9. 然后Service層處理業(yè)務(wù)邏輯,最后返回給Controller層
      10. 但我覺得小項(xiàng)目的話,Service其實(shí)和Model就有點(diǎn)平級(jí)的意思,因?yàn)橛行┖唵蔚慕涌贛odel層直接對(duì)接Controller就可以了,只有相對(duì)復(fù)雜的接口,比如用戶權(quán)限,就可以再經(jīng)過Service層分隔不同功能的代碼。

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

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

        由于是基于微信,我們需要三個(gè)信息: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
         );
         }

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

        然后是通過發(fā)送網(wǎng)絡(luò)請(qǐng)求的步驟就在此略過。微信服務(wù)器會(huì)返回包含openid的對(duì)象,判斷這個(gè)對(duì)象的值沒問題后,我們就開始生成令牌的步驟了,創(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è)定的過期時(shí)間
        
         $request = cache($key, $value, $tokenExpire);
         if (!$request) {
         throw new TokenException([
         'msg' => '服務(wù)器緩存異常',
         'errorCode' => 10005
         ]);
         }
         return $key; // 返回令牌:token
        }

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

      11. 拿到openid
      12. 查看數(shù)據(jù)庫,檢查openid是否已經(jīng)存在
      13. 如果存在,不處理,反之則新增一條user記錄
      14. 生成令牌,準(zhǔn)備緩存數(shù)據(jù),寫入緩存
      15. 把令牌返回到客戶端去
      16. 其中generateToken()這個(gè)方法詳細(xì)定義如下:

        public static function generateToken() {
         $randomChars = getRandomChars(32); // 32個(gè)字符組成一組隨機(jī)字符串
         $timestamp = $_SERVER['REQUEST_TIME_FLOAT']; 
         $salt = config('security.token_salt'); // salt 鹽
         // 拼接三組字符串,進(jìn)行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里也會(huì)用到,所以是放在Token基類里的。

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

        三、總結(jié)

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

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

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。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類處理整個(gè)邏輯;4、在Model層里建立User類;5、在驗(yàn)證器類和異常類創(chuàng)建相應(yīng)的驗(yàn)證方法和異常處理。推薦:《PHP視頻教程》PHP_設(shè)置權(quán)限令牌Token我們開發(fā)的后端
        推薦度:
        標(biāo)簽: 權(quán)限 php 怎么
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产在线19禁免费观看| 免费在线看黄的网站| 日本阿v免费费视频完整版| 亚洲av综合avav中文| 精品国产污污免费网站入口在线 | 无码人妻久久一区二区三区免费 | 成年午夜视频免费观看视频| 亚洲美女人黄网成人女| 足恋玩丝袜脚视频免费网站| 中文字幕亚洲综合精品一区| 国产福利视精品永久免费| 91丁香亚洲综合社区| 国内精品免费视频自在线| 看全免费的一级毛片| 亚洲情侣偷拍精品| 免费观看久久精彩视频| 婷婷亚洲综合五月天小说| 4444www免费看| 亚洲爆乳成av人在线视菜奈实| 午夜免费福利影院| 丰满妇女做a级毛片免费观看 | 日韩精品亚洲专区在线观看| 狠狠躁狠狠爱免费视频无码| 亚洲国产一成人久久精品| 日本免费一区二区三区| 亚洲久悠悠色悠在线播放| 免费看国产曰批40分钟| 中文字幕无线码免费人妻| 亚洲高清中文字幕综合网| 久久精品女人天堂AV免费观看| 久久亚洲中文字幕无码| 国产成人A亚洲精V品无码| 18禁无遮挡无码国产免费网站| 亚洲人成网站999久久久综合| 少妇亚洲免费精品| 久久久久久毛片免费播放| 亚洲精品GV天堂无码男同| 久久91亚洲人成电影网站| 免费A级毛片无码无遮挡内射| 黄色免费网址在线观看| 亚洲最新永久在线观看|