ThinkPHP5使用jwt進(jìn)行會(huì)話驗(yàn)證

以往吴趴,沒有做過前后端分離的項(xiàng)目之前,都是服務(wù)器渲染的模板侮攀,然后用cookie和session進(jìn)行賬號(hào)的權(quán)限驗(yàn)證或者是登錄狀態(tài)的管理锣枝。后來接觸了vue和小程序之后,在進(jìn)行前后端分離的時(shí)候兰英,就會(huì)遇到權(quán)限驗(yàn)證和登錄會(huì)話保存撇叁。因?yàn)镠TTP協(xié)議是開放的,可以任人調(diào)用畦贸。所以陨闹,如果接口不希望被隨意調(diào)用,就需要做訪問權(quán)限的控制薄坏,認(rèn)證是好的用戶趋厉,才允許調(diào)用API。

JWT優(yōu)點(diǎn)

1:服務(wù)端不需要保存?zhèn)鹘y(tǒng)會(huì)話信息胶坠,沒有跨域傳輸問題君账,減小服務(wù)器開銷。

2:jwt構(gòu)成簡(jiǎn)單沈善,占用很少的字節(jié)乡数,便于傳輸。

3:json格式通用闻牡,不同語(yǔ)言之間都可以使用净赴。

jwt由三部分組成:

頭部(header) 載荷(payload) 包含一些定義信息和自定義信息 簽證(signature)

所以這里就會(huì)用到bearer的令牌訪問,就是jwt罩润;定義:為了驗(yàn)證使用者的身份劫侧,需要客戶端向服務(wù)器端提供一個(gè)可靠的驗(yàn)證信息,稱為Token哨啃,這個(gè)token通常由Json數(shù)據(jù)格式組成,通過hash散列算法生成一個(gè)字符串写妥,所以稱為Json Web Token(Json表示令牌的原始值是一個(gè)Json格式的數(shù)據(jù)拳球,web表示是在互聯(lián)網(wǎng)傳播的,token表示令牌珍特,簡(jiǎn)稱JWT)

首先我們從GitHub處用composer require firebase/php-jwt下載firebase/php-jwt祝峻,怎么用composer我就不累述了,我過去的文章里面有安裝教程。

安裝好了之后莱找,我們可以新建一個(gè)user控制來測(cè)試代碼的完整性酬姆,首先我們創(chuàng)建三個(gè)控制方法

Base.php

基礎(chǔ)控制器base.php主要是用來驗(yàn)證每次接受請(qǐng)求的時(shí)候,驗(yàn)證http請(qǐng)求頭里面是否攜帶了token奥溺,如何將token放到請(qǐng)求頭里面辞色,這個(gè)前端會(huì)做的了。

<?php

/**

* Created by PhpStorm.

* User: nobita

* Date: 2/15

* Time: 14:55

*/

namespace app\user\controller;

use think\Request;

use Firebase\JWT\JWT;

use think\Controller;

class Base extends Controller

{

? ? public function _initialize()

? ? {

? ? ? ? parent::_initialize();

? ? ? ? $this->checkToken();

? ? }

? ? public function checkToken()

? ? {

? ? ? ? $header = Request::instance()->header();

? ? ? ? if ($header['authorization'] == 'null'){

? ? ? ? ? ? echo json_encode([

? ? ? ? ? ? ? ? 'status' => 1002,

? ? ? ? ? ? ? ? 'msg' => 'Token不存在,拒絕訪問'

? ? ? ? ? ? ]);

? ? ? ? ? ? exit;

? ? ? ? }else{

? ? ? ? ? ? $checkJwtToken = $this->verifyJwt($header['authorization']);

? ? ? ? ? ? if ($checkJwtToken['status'] == 1001) {

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? //校驗(yàn)jwt權(quán)限API

? ? protected function verifyJwt($jwt)

? ? {

? ? ? ? $key = md5('nobita');

? ? ? ? // JWT::$leeway = 3;

? ? ? ? try {

? ? ? ? ? ? $jwtAuth = json_encode(JWT::decode($jwt, $key, array('HS256')));

? ? ? ? ? ? $authInfo = json_decode($jwtAuth, true);

? ? ? ? ? ? $msg = [];

? ? ? ? ? ? if (!empty($authInfo['user_id'])) {

? ? ? ? ? ? ? ? $msg = [

? ? ? ? ? ? ? ? ? ? 'status' => 1001,

? ? ? ? ? ? ? ? ? ? 'msg' => 'Token驗(yàn)證通過'

? ? ? ? ? ? ? ? ];

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? $msg = [

? ? ? ? ? ? ? ? ? ? 'status' => 1002,

? ? ? ? ? ? ? ? ? ? 'msg' => 'Token驗(yàn)證不通過,用戶不存在'

? ? ? ? ? ? ? ? ];

? ? ? ? ? ? }

? ? ? ? ? ? return $msg;

? ? ? ? } catch (\Firebase\JWT\SignatureInvalidException $e) {

? ? ? ? ? ? echo json_encode([

? ? ? ? ? ? ? ? 'status' => 1002,

? ? ? ? ? ? ? ? 'msg' => 'Token無效'

? ? ? ? ? ? ]);

? ? ? ? ? ? exit;

? ? ? ? } catch (\Firebase\JWT\ExpiredException $e) {

? ? ? ? ? ? echo json_encode([

? ? ? ? ? ? ? ? 'status' => 1003,

? ? ? ? ? ? ? ? 'msg' => 'Token過期'

? ? ? ? ? ? ]);

? ? ? ? ? ? exit;

? ? ? ? } catch (Exception $e) {

? ? ? ? ? ? return $e;

? ? ? ? }

? ? }

}

Login.php

登錄控制器浮定,只要是用來驗(yàn)證用戶輸入的賬號(hào)密碼是否匹配數(shù)據(jù)庫(kù)的信息相满,如果匹配的話,就申請(qǐng)token桦卒,并且返回token給前端儲(chǔ)存在本地立美,每次請(qǐng)求的時(shí)候把token假如到請(qǐng)求頭里面

<?php

/**

* Created by PhpStorm.

* User: nobita

* Date: 2/15

* Time: 14:55

*/

namespace app\user\controller;

use app\common\model\nobita\Test as TestModel;

use Firebase\JWT\JWT;

class Login

{

? ? public function index()

? ? {

? ? ? ? $data = input('post.');

? ? ? ? $username = htmlspecialchars($data['username']);

? ? ? ? $password = htmlspecialchars($data['password']);

? ? ? ? $user = TestModel::where('username', $username)->find();

? ? ? ? if (!empty($user)) {

? ? ? ? ? ? if ($username === $user['username'] && $password === $user['password']) {

? ? ? ? ? ? ? ? $msg = [

? ? ? ? ? ? ? ? ? ? 'status' => 1001,

? ? ? ? ? ? ? ? ? ? 'msg' => '登錄成功',

? ? ? ? ? ? ? ? ? ? 'jwt' => self::createJwt($user['id'])

? ? ? ? ? ? ? ? ];

? ? ? ? ? ? ? ? return $msg;

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? return [

? ? ? ? ? ? ? ? ? ? 'status' => 1002,

? ? ? ? ? ? ? ? ? ? 'msg' => '賬號(hào)密碼錯(cuò)誤'

? ? ? ? ? ? ? ? ];

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? return [

? ? ? ? ? ? ? ? 'status' => 1002,

? ? ? ? ? ? ? ? 'msg' => '請(qǐng)輸入賬號(hào)密碼'

? ? ? ? ? ? ];

? ? ? ? }

? ? }

? ? public function createJwt($userId)

? ? {

? ? ? ? $key = md5('nobita'); //jwt的簽發(fā)密鑰,驗(yàn)證token的時(shí)候需要用到

? ? ? ? $time = time(); //簽發(fā)時(shí)間

? ? ? ? $expire = $time + 14400; //過期時(shí)間

? ? ? ? $token = array(

? ? ? ? ? ? "user_id" => $userId,

? ? ? ? ? ? "iss" => "https://199508.com",//簽發(fā)組織

? ? ? ? ? ? "aud" => "https://199508.com", //簽發(fā)作者

? ? ? ? ? ? "iat" => $time,

? ? ? ? ? ? "nbf" => $time,

? ? ? ? ? ? "exp" => $expire

? ? ? ? );

? ? ? ? $jwt = JWT::encode($token, $key);

? ? ? ? return $jwt;

? ? }

}

User.php

用來驗(yàn)證代碼的完整性

<?php

/**

* Created by PhpStorm.

* User: nobita

* Date: 2/15

* Time: 15:24

*/

namespace app\user\controller;

use think\Request;

use app\common\model\nobita\Test as TestModel;

class User extends Base //繼承基礎(chǔ)控制器

{

? ? public function index()

? ? {

? ? ? ? return TestModel::all();

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末方灾,一起剝皮案震驚了整個(gè)濱河市建蹄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裕偿,老刑警劉巖洞慎,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異击费,居然都是意外死亡拢蛋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門蔫巩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆棱,“玉大人,你說我怎么就攤上這事圆仔±疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵坪郭,是天一觀的道長(zhǎng)个从。 經(jīng)常有香客問我,道長(zhǎng)歪沃,這世上最難降的妖魔是什么嗦锐? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮沪曙,結(jié)果婚禮上奕污,老公的妹妹穿的比我還像新娘。我一直安慰自己液走,他們只是感情好碳默,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布贾陷。 她就那樣靜靜地躺著,像睡著了一般嘱根。 火紅的嫁衣襯著肌膚如雪髓废。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天该抒,我揣著相機(jī)與錄音慌洪,去河邊找鬼。 笑死柔逼,一個(gè)胖子當(dāng)著我的面吹牛蒋譬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愉适,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼犯助,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了维咸?” 一聲冷哼從身側(cè)響起剂买,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎癌蓖,沒想到半個(gè)月后瞬哼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡租副,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年坐慰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片用僧。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡结胀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出责循,到底是詐尸還是另有隱情糟港,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布院仿,位于F島的核電站秸抚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏歹垫。R本人自食惡果不足惜剥汤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望排惨。 院中可真熱鬧吭敢,春花似錦茎芭、人聲如沸铅祸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谴麦。三九已至蠢沿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匾效,已是汗流浹背舷蟀。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留面哼,地道東北人野宜。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像魔策,于是被迫代替她去往敵國(guó)和親匈子。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容