一、登录流程?
前端发送请求 -> 后端验证通过后签发 Token -> 前端存入token,在请求其他接口是将token带入header头中
二、使用步骤
1.引入 jwt 库
安装:
composer require firebase/php-jwt
依赖composer,通过 cmd 进入项目根目录 或者 项目终端 安装:
检查项目vendor文件中生成了以下文件就代表安装成功
引入:
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的签发时间
"nbf" => time(), //定义在某个时间前 jwt 是不可用的
"exp" => time() + 60 * 60 * 24 * 7, // jwt 的过期时间(大于签发时间),规则:秒*分*时*天
"uid" => $checkuser['id'] // 自定义的数据:这里我带了用户id
);
$jwt = JWT::encode($token, $key, "HS256"); //调用方法
返回数据格式:
3.解密 token
我是在控制器中单独创建的一个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;
验证方法:
class Token extends BaseController
{
/**
* Token验证
*/
// 验证 token
protected function initialize()
{
parent::initialize();
$header = request()->header();
if (!isset($header['token']) || $header['token'] == null) {
echo json(['code' => 0, 'msg' => 'token不能为空'], 400)->send();
die();
}
$token = $header['token'];
$key = 'adminTokenpwd'; // 解密token,key必须与签发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' => '登录状态过期'], 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();
}
}
}
总结
团结就是力量,分享是温故知新