JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。今天给大家封装一个JWT的类,以及调用用法。
小编环境:laravel php7 composer
第一件事情先搞一块JWT的插件
我在https://jwt.io看中了这款:
https://github.com/lcobucci/jwt/blob/3.3/README.md 可以根据自己实际情况选择适合自己的版本。本案例是基于此插件。
下载安装jwt:

composer require lcobucci/jwt

选择自己自定义组件封装路径 我的是:app/Common/Auth/下,建立JwtAuth类

/**
 * Created by PhpStorm.
 * User: zhaoxinglu
 * Date: 2019/7/19
 * Time: 14:44
 */

namespace App\Common\Auth;

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

class JwtAuth
{
    /**
     * @var 单例限制
     */
    static private $instance=null;

    /**
     * @var 秘钥信息
     * 编码秘钥
     * 解码秘钥
     */
    private $token;
    private $decodetoken;

    /**
     * @var头信息
     * 发布者
     * 接受者
     * 识别码
     * 有效周期
     */
    private $iss = "Phor";
    private $aud = "App";
    private $ident = "Esint";
    private $effective_time = 60*60;

    /**
     * @var
     * 加密信息
     */
    public $uid;
    //多个加密信息

    /**
     * @var 秘钥
     */
    private $secret = "ljbpyshagcssjcsa";

    /**
     * @return JwtAuth|单例限制
     */
    static public function getInstance()
    {
        if (is_null(self::$instance))
        {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * JwtAuth constructor. 私有化构造函数 单例
     */
    private function __construct()
    {
    }

    /**
     * 私有化克隆函数
     */
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     * @param $uid
     * 初始化uid
     */
    public function setUid($uid)
    {
        $this->uid = $uid;
    }

    /**
     * @return string
     * 调用token
     */
    public function get_token()
    {
        $this->encode();

        return (string)$this->token;
    }

    /**
     * @return 秘钥信息|\Lcobucci\JWT\Token
     * 编码token
     */
    public function encode()
    {
        $signer = new Sha256();
        $time = time();
        $this->token = (new Builder())
            ->issuedBy($this->iss) //颁发者
            ->permittedFor($this->aud) // 接受者
            ->identifiedBy($this->ident, true) // 识别码
            ->issuedAt($time) // 颁发时间 (iat claim)
            ->canOnlyBeUsedAfter($time) //可用时间(nbf claim)
            ->expiresAt($time + $this->effective_time) //失效时间(exp claim)
            ->withClaim('uid', $this->uid) // 填充加密 "uid" // 填充加密 "uid"  多参数继续操作此方法
            ->getToken($signer, new Key($this->secret)); // 返回token 加密方式Sha256 秘钥:secrect

        return $this->token;

    }

    /**
     * @param $token
     * 解码token
     */
    public function setToken($token)
    {

        $this->token = (new Parser())->parse((string) $token);
        $this->decode();

    }

    /**
     * 解码加密信息
     */
    public function decode(){
        $this->uid = $this->token->getClaim('uid');//多参数这里也要添加多参数解码token
    }

    /**
     * @return mixed
     * 检验token信息 是否过期等
     */
    public function validate()
    {
        $data = new ValidationData();
        $data->setIssuer($this->iss);
        $data->setAudience($this->aud);
        $data->setId($this->ident);
        $data->setCurrentTime(time());

        return $this->token->validate($data);
    }

    /**
     * @return mixed
     * 验证token加密方式 以及秘钥
     */
    public function verify()
    {
        $signer = new Sha256();

        return $this->token->verify($signer, new Key($this->secret));
    }

}

调用: 业务层控制器调用

1.引用生成token

    $jwt = JwtAuth::getInstance();
        $jwt->setUid($‘用户uid’);
        $token = $jwt->get_token();
       

2.检验token

假设用户发送过来的token  存入$token
$jwt = JwtAuth::getInstance();
        $jwt->setToken($token);
        var_dump($jwt->validate());//检验token是否过期等
        var_dump($jwt->verify());//检验加密以及秘钥

3.解密token获取参数

$jwt->setToken($token);
$uid=$jwt->uid;

以上←