json web token JWT实现TP5创建和验证

 

                                                    根据博客进行jwt初始化配置

https://blog.csdn.net/weixin_43389208/article/details/117442266?spm=1001.2014.3001.5501

https://www.cnblogs.com/anhan/p/14954953.html

1.composer 安装JWT

composer require lcobucci/jwt 3.3

 2.在extend/tools/jwt创建Token.php

注意:如果没有该目录,则自行创建。

 3.

Token.php书写以下代码

自写代码:

<?php

namespace tools\jwt;

use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\ValidationData;

class Token
{
    public static function createToken($uid = null)
    {
        $signer = new Sha256();//加密规则
        $time = time();//当前时间
        $token = (new Builder())
            ->issuedBy('teacher')//签发人
            ->canOnlyBeUsedBy('student')//接收人
            ->identifiedBy('MarsLei', true) //标题id
            ->issuedAt($time)//发出令牌的时间
            ->canOnlyBeUsedAfter($time) //生效时间(即时生效)
            ->expiresAt($time + 3600) //过期时间
            ->with('uid', $uid) //用户id
            ->sign($signer, 'my') //签名
            ->getToken(); //得到token
        return (string)$token;
    }
//在框架中对JWT解密方法进行封装。

    public static function verifyToken($token=null){
        //检测是否接收到了token
        if(empty($token)){
            return 0;
        }
        //转化为可以验证的token
        $token = (new Parser())->parse((string) $token);
        //验证基本设置
        $data = new ValidationData();
        $data->setIssuer('teacher');
        $data->setAudience('student');
        $data->setId('MarsLei');

        if(!$token->validate($data)){
            return 0;
        }
        //验证签名
        $signer = new Sha256();
        if(!$token->verify($signer, 'my')){
            return 0;
        }
        //验证通过,返回用户id
        return $token->getClaim('uid');
    }

}


 

重新引用以下代码,以防止报错:

书写登录表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="http://apps.bdimg.com/libs/bootstrap/3.3.0/css/bootstrap.min.css">
</head>
<body>
<div style="width: 300px">
    <div class="form-group">
        <label for="name">名称</label>
        <input type="text" class="form-control account" name="account"   >
    </div>
    <div class="form-group">
        <label for="name">密码</label>
        <input type="password" class="form-control password" name="password"   >
    </div>
    <input type="hidden" name="__token__" value="{$Request.token}" />
    <input type="button"  id="login" value="立即登录">
</div>
</body>
</html>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
</script>
<script>
    $('#login').click(function (){
        var account =$('.account').val();
        var password=$('.password').val();
        var token=localStorage.getItem('token');
        $.ajax({
            url:'/ajax/login/loginSuccess',
            type:'POST',
            headers:{
                Authorization:token,
            },

            data:{
                account:account,
                password:password,
                __token__:"{$Request.token}",
            },
            dataType:'json',
            success:function (res){
                console.log(res);
                if (res.code==200){
                    alert('登录成功');
                    //将用户res里的Token存入在本地
                    localStorage.setItem('token',res.data.token);
                    location.href='/ajax/ajax/index?token='+token;
                }
            }
        })
    })

</script>

切记,页面路由跳转是要携带token,由基类判断是否携带token

 

 

在模块下新创建一个Base基类控制器,书写判断代码,用于其他控制器的继承。

<?php

namespace app\ajax\controller;

use think\Controller;
use think\Request;
use tools\jwt\Token;

class Base extends Controller
{
    //
    public function __construct(Request $request = null)
    {
        parent::__construct($request);

        //接收token
        $token=input('token');
        //判断$token,如果是空的,返回登录界面
        if (empty($token)){
            $this->error('缺少token参数,请先登录','/ajax/login/login');
        }
//验证token
        $userId=Token::verifyToken($token);
        if (!$userId){
            $this->error('token参数失效,请先登录','/ajax/login/login');
        }

    }
}

控制器继承基类控制器

登录控制器调用Token,记录用户的id

//生成token
$token = Token::createToken($userInfo['id']); //生成token
<?php

namespace app\ajax\controller;

use app\ajax\model\AjaxModel;
use think\Controller;
use think\Session;
use tools\jwt\Token;

class Login extends Controller
{
    //展示登录页面
    public function login(){
        return view();
    }

    public function loginSuccess(){
        $params = $this->request->post();
        //验证user表是否与用户输入的信息向匹配
        $data = AjaxModel::getLogininfo($params);
        if ($params['account'] != $data['username']) {
            $this->error('账号输入错误', '/ajax/ajax/create');
        }
        if ($params['password'] != $data['userpassword']) {
            $this->error('密码输入错误', '/ajax/ajax/create');
        }
        //生成token令牌
        $token = Token::createToken($data['id']);
        //将令牌放在session中
        Session::set('token',$token);
        $data['token']=$token;
        //查看用户权限
        $id=$data['id'];
        $userNode= AjaxModel::getUserNodeALL($id);
        //模型层级完成后将数据记录到session中
        Session::set('userNode',$userNode);
        return getJsonData(200,'success', $token);
    }
}

 

 

 

posted @ 2021-08-25 14:12  王越666  阅读(79)  评论(0编辑  收藏  举报