一、登錄流程?
前端發(fā)送請求 -> 后端驗證通過后簽發(fā) Token -> 前端存入token,在請求其他接口是將token帶入header頭中
二、使用步驟
1.引入 jwt 庫
安裝:
composer require firebase/php-jwt
依賴composer,通過 cmd 進入項目根目錄 或者 項目終端 安裝:
檢查項目vendor文件中生成了以下文件就代表安裝成功

45adac3656a54250b58c9922507af22d.png
引入:
use Firebase\JWT\JWT;
2.生成 token
代碼:
public function loginpwd($username, $password)
{
$password = md5($password);
$loginpwd = new user();
$checkuser = $loginpwd->checkuser($username, $password);
if ($checkuser['code'] == 0) {
return json($checkuser);
} else if ($checkuser['code'] == 1) {
$key = 'adminTokenpwd';
$token = array(
"iat" => time(),
"nbf" => time(),
"exp" => time() + 60 * 60 * 24 * 7,
"uid" => $checkuser['id']
);
$jwt = JWT::encode($token, $key, "HS256");
return json(['code' => 1, 'msg' => '登陸成功', 'token' => $jwt]);
} else {
return json($checkuser);
}
}
核心:
$key = 'adminTokenpwd'; //自定義key,必須與驗證token中的key一致
$token = array(
"iat" => time(), // jwt的簽發(fā)時間
"nbf" => time(), //定義在某個時間前 jwt 是不可用的
"exp" => time() + 60 * 60 * 24 * 7, // jwt 的過期時間(大于簽發(fā)時間),規(guī)則:秒*分*時*天
"uid" => $checkuser['id'] // 自定義的數(shù)據(jù):這里我?guī)Я擞脩鬷d
);
$jwt = JWT::encode($token, $key, "HS256"); //調用方法
返回數(shù)據(jù)格式:

877664ec9c9f4af4afbe17a9661563ef.png
3.解密 token
我是在控制器中單獨創(chuàng)建的一個Token文件,也可以放在中間件。
這里我繼承的BaseController ,其他接口文件直接繼承Token
引入:
use Exception;
use Throwable;
use Firebase\JWT\JWT;
use app\BaseController;
use Firebase\JWT\ExpiredException;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\SignatureInvalidException;
驗證方法:
``PHP
class Token extends BaseController
{
/**
* Token驗證
*/
// 驗證 token
protected function initialize()
{
parent::initialize();
header['token']) ||
token = $header['token'];
$key = 'adminTokenpwd'; // 解密token,key必須與簽發(fā)token中的key一致
try {
$info = JWT::decode($token, $key, ['HS256']);
$this->uid = $info->uid;
} catch (SignatureInvalidException $e) { //簽名不正確
echo json(['code' => 0, 'status' => $e->getCode(), 'msg' => '簽名不正確'], 400)->send();
die();
} catch (BeforeValidException $e) { // 簽名在某個時間點之后才能用
echo json(['code' => 1, 'status' => $e->getCode(), 'msg' => '賬號未到可用時間'], 400)->send();
die();
} catch (ExpiredException $e) { // token過期
echo json(['code' => 2, 'status' => $e->getCode(), 'msg' => '登錄狀態(tài)過期'], 400)->send();
die();
} catch (Exception $e) { //其他錯誤
echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
die();
} catch (Throwable $e) {
echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
die();
}
}
}