TP5.0实现jwt的创建和验证

composer 安装jwt

composer require lcobucci/jwt 3.3

 

在extend/tools/jwt创建Token.php

注意:框架本身的extend 的目录下是没有文件夹的 需要自己创建

TP5.0实现jwt的创建和验证

 

 

在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
{

    /**
     * 生成token
     * @param null $uid
     * @return string
     */
    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;
    }

    /**
     *
     * 解密 验证token
     * @param null $token
     * @return int|mixed
     */
    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‘);
    }

}


?>

 

生成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;
    }

 

验证token 

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‘);
    }

 

在控制器里面如何的生成token

先要将创建的文件引入控制器中

use tools\jwt\Token;

然后登录成功时生成token 并传到前端

   //生成token
     $token = Token::createToken($result[‘id‘]); //这里的$result 是登录查询返回的数组
     eturn json([‘code‘=>200,‘message‘=>‘success‘,‘data‘=>$token]);

在前端保存到本地cookie 和如何取出

localStorage.setItem(‘token‘,res.data)//res 是值前端发送Ajax请求成功后的回调函数的形参

localStorage.getItem(‘token‘) //获取本地的token

在控制器里面验证

if (empty($token)){
      $this->error(‘缺少token参数‘,‘admin/login/login‘);
}

$res = Token::verifyToken($token);

if($res==0){
    $this->error(‘token失效‘,‘admin/login/login‘);
}

 

TP5.0实现jwt的创建和验证

上一篇:WebService在Windows7部署问题


下一篇:React方法