首先安装一个JWT插件
composer require firebase/php-jwt
创建一个services的目录 然后再该目录下新建一个JWTService类 类内封装如何生成JWT(牌子)、验证JWT(牌子)
<?php
namespace app\services;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class JwtService
{
public function checkToken()//这个方法是为了生成JWT (就是做牌子)
{
$key = "菲律宾男演员"; //自定义key值
$payload = array(
"iss" => "http://菲律宾男演员.xyz",
"aud" => "https://菲律宾男演员.xyz",
"iat" => time(), //初始时间
"nbf" => time()+10000, //过期时间
'uid' =>1, //前端页面传uid
);
$jwt = JWT::encode($payload, $key, 'HS256');
return $jwt;
}
public function verificationToken($token)//这个方法就是验证JWT(就是看看是不是我给你的牌子)
{
$key = "菲律宾男演员"; //自定义key值
$decoded = JWT::decode($token, new Key($key, 'HS256'));
return $decoded;
}
}
public function generateToken()//登录的时候走到这个方法
{
$tokenJwt = new JwtService();//实例化你创建的那个类(为了引用)
$dataToken = $tokenJwt->checkToken();//调用哪个类里的方法
return view('/login',['token'=>$dataToken]);//返回结果到页面(主要是为了登录时页面携带回来进行比对)
}
public function verificationToken(Request $request)
{
$data = $request->post();
$mod_reg = new WorkerModel();//实例化模型进行登录的验证
$res = $mod_reg->reg($data['user']);
if ($res){
if ($res->pass ==$data['pass']){
return '登录成功';
// return ['code'=>200,'data'=>['a'=>$token]];//json格式返回(此处的$token是随便写的 吼吼吼吼吼吼吼~~~)
}else{
return '密码不正确';
// return ['code'=>500,'data'=>['a'=>'密码不正确']];
}
}else{
return '用户不存在';
// return ['code'=>1000,'data'=>['a'=>'用户不存在']];
}
}
创建个中间键
php think make:middleware CheckToken
中间键里面封装以下内容
public function handle($request, \Closure $next)
{
$token = $request->post('token');
$tokenJwt = new JwtService();
if (!$token) return response('token不能为空');
try {
$data = $tokenJwt->verificationToken($token);
}catch (\Exception $e){
return json('token值有误');
}
return $next($request);
}
路由:
Route::get('login','WorkerController/generateToken')->allowCrossDomain();//登录路由
Route::post('loge','WorkerController/verificationToken')->middleware(\app\middleware\CheckToken::class);//登录时传值的路由
注:如果一直都是验证token值有误那可能是时区不同
打开你的JWT拓展找到JWT.php 找到第129行左右的位置把下面这段代码注视掉就好了了了了
if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) {
throw new BeforeValidException(
'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->nbf)
);
}