您的当前位置:首页正文

JWT之给你个牌子

2024-11-29 来源:个人技术集锦
首先安装一个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)
            );
        }

显示全文