老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

php設(shè)置token的方法-創(chuàng)新互聯(lián)

這篇文章主要介紹php設(shè)置 token的方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),微信小程序開發(fā),10多年建站對(duì)石雕等多個(gè)方面,擁有多年的網(wǎng)站制作經(jīng)驗(yàn)。

php設(shè)置token的方法:首先定義獲取Token的路由路徑;然后建立Service層;接著在Model層里建立User類,并在驗(yàn)證器類和異常類創(chuàng)建相應(yīng)的驗(yà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類
    • UserToken類處理整個(gè)邏輯:Token生成和返回
  3. 在Model層里建立User類,負(fù)責(zé)用戶數(shù)據(jù)表的讀寫,供Service層的UserToken調(diào)用
  4. 在驗(yàn)證器類和異常類創(chuàng)建相應(yīng)的驗(yàn)證方法和異常處理
  5. 控制器->Service層->Model層返回值給Service層->Service層返回值給控制器,整個(gè)流程完成Token令牌的編寫

二、具體說明

首先定義好路由路徑:

Route::post(    'api/:version/token/user',    'api/:version.Token/getToken');復(fù)制代碼

然后創(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
        ];
    }復(fù)制代碼

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

class TokenGet extends BaseValidate
{
    protected $rule = [      'code' => 'require|isNotEmpty'
    ];

    protected $message = [        'code' => '需要code才能獲得Token!'
    ];
 }復(fù)制代碼

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

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

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

  • Model層只負(fù)責(zé)操作數(shù)據(jù)庫并返且返回給Service層
  • 然后Service層處理業(yè)務(wù)邏輯,最后返回給Controller層

但我覺得小項(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
    );
    }復(fù)制代碼

然后把這三個(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
}復(fù)制代碼

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

  • 拿到openid
  • 查看數(shù)據(jù)庫,檢查openid是否已經(jīng)存在
  • 如果存在,不處理,反之則新增一條user記錄
  • 生成令牌,準(zhǔn)備緩存數(shù)據(jù),寫入緩存
  • 把令牌返回到客戶端去

其中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;
}復(fù)制代碼

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

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

三、總結(jié)

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

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

以上是php設(shè)置 token的方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!


分享標(biāo)題:php設(shè)置token的方法-創(chuàng)新互聯(lián)
本文來源:http://www.xueling.net.cn/article/dgjpgd.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 国产三级av在线播放 | 亚洲国产高清AV网站 | 国产a级大片 | 人妻内射一区二区在线视频 | 少妇与大狼拘作爱视频 | 狠狠干夜夜操天天爽 | 国产精品亚洲专区无码影院 | 老汉av久久午夜一区 | 噜噜噜在线观看免费视频日本 | 欧美精品亚洲 | 欧美性大战久久久久久久小说 | 久99视频 | 综合激情久久综合激情 | 日韩欧美在线一级 | 麻豆国产成人AV在线播放欲色 | 国产在线观看高清视频黄网 | 国产一区在线免费观看 | 美日韩精品一区二区三区 | 国产黄色大片 | 日韩三级一区 | 国产欧美日韩资源在线观看 | 多人调教到高潮失禁h重口文 | 久久久久久久久久久久久久久 | 国内外精品视频 | 亚洲国产欧美国产综合久久 | 无码精品视频一区二区三区 | 久久成人免费日本黄色 | 亚洲精品.www| 亚洲一级片网站 | 巨茎中出肉欲人妻在线视频 | 国产欧美日韩精品在线观看 | 欧美xxxx色视频在线观看免费 | 日本天堂免费观看 | 亚洲中文字幕无码一区二区三区 | 国产AV无码专区亚洲AV中文 | 日韩视频在线观看一区二区 | 久草在线播放视频 | 亚洲欧美久久久 | 国产精品视频xxx | 亚州福利视频 | 国产不卡网 |