一、登錄流程魂务?
前端發(fā)送請(qǐng)求 -> 后端驗(yàn)證通過(guò)后簽發(fā) Token -> 前端存入token隆敢,在請(qǐng)求其他接口是將token帶入header頭中
二、使用步驟
1.引入 jwt 庫(kù)
安裝:
composer require firebase/php-jwt
依賴composer蛙卤,通過(guò) cmd 進(jìn)入項(xiàng)目根目錄 或者 項(xiàng)目終端 安裝:
檢查項(xiàng)目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,必須與驗(yàn)證token中的key一致
$token = array(
"iat" => time(), // jwt的簽發(fā)時(shí)間
"nbf" => time(), //定義在某個(gè)時(shí)間前 jwt 是不可用的
"exp" => time() + 60 * 60 * 24 * 7, // jwt 的過(guò)期時(shí)間(大于簽發(fā)時(shí)間),規(guī)則:秒*分*時(shí)*天
"uid" => $checkuser['id'] // 自定義的數(shù)據(jù):這里我?guī)Я擞脩鬷d
);
$jwt = JWT::encode($token, $key, "HS256"); //調(diào)用方法
返回?cái)?shù)據(jù)格式:
877664ec9c9f4af4afbe17a9661563ef.png
3.解密 token
我是在控制器中單獨(dú)創(chuàng)建的一個(gè)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;
驗(yàn)證方法:
``PHP
class Token extends BaseController
{
/**
* Token驗(yàn)證
*/
// 驗(yàn)證 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) { // 簽名在某個(gè)時(shí)間點(diǎn)之后才能用
echo json(['code' => 1, 'status' => $e->getCode(), 'msg' => '賬號(hào)未到可用時(shí)間'], 400)->send();
die();
} catch (ExpiredException $e) { // token過(guò)期
echo json(['code' => 2, 'status' => $e->getCode(), 'msg' => '登錄狀態(tài)過(guò)期'], 400)->send();
die();
} catch (Exception $e) { //其他錯(cuò)誤
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();
}
}
}