本文实例讲述了thinkphp5框架中使用jwt的方法。分享给大家供大家参考,具体如下:

jwt下载地址:

可以直接去github上下载,也可以使用composer

使用composer的话要确保你的电脑上安装了composer,进入项目根目录下载即了,自动会放在vendor目录下

创建文件

我是放在common目录下

使用教程

github都有的

贴源码

jwtauth.php

<?php
namespace app\common\auth;
use \lcobucci\jwt\builder;
use \lcobucci\jwt\signer\hmac\sha256;
use \lcobucci\jwt\parser;
use \lcobucci\jwt\validationdata;
/**
 * 单例模式
 */
class jwtauth
{
    private static $instance;
    /**
     * jwt token
     * @var [type]
     */
    private $token;
    /**
     * 颁发
     * @var string
     */
    private $iss = 'api.test.com';
    /**
     * 接收
     * @var string
     */
    private $aud = 'app.com';
 
    private $uid;
 
    private $secrect="#$%#$%*&^(*(*(";
 
    private $decodetoken;
 
    public static function getinstance() {
        if(is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }
 
    private function __contruct(){
 
    }
 
    private function __clone(){
 
    }
 
    public function encode(){
        $time = time();
        $this->token = (new builder())->setheader('alg','hs256')
            ->setissuer($this->iss)
            ->setaudience($this->aud)
            ->setissuedat($time) //生效时间
            ->setexpiration($time + 20)//过期时间
            ->set('uid',$this->uid)
            ->sign(new sha256(), $this->secrect)//加密算法
            ->gettoken();
 
            return $this;
    }
 
    public function gettoken(){
        return (string)$this->token;
    }
 
    public function settoken($token){
        $this->token = $token;
        return $this;
    }
    /**
     * 用户信息uid
     * @param [type] $uid [description]
     */
    public function setuid($uid){
        $this->uid = $uid;
        return $this;
    }
 
    public function jsondecode(){
 
        $token = $this->token;
        $this->decodetoken = (new parser())->parse((string) $token); 
 
        // echo $this->decodetoken->getclaim('uid');
        return $this->decodetoken;
    }
    /**
     * 验证令牌是否有效
     * @return [type] [description]
     */
    public function validate(){
 
        $data = new validationdata();
        $data->setissuer($this->iss);
        $data->setaudience($this->aud);
        return $this->jsondecode()->validate($data);
 
    }
    /**
     * 签名来验证令牌在生成后是否未被修改
     * @return [type] [description]
     */
    public function verify(){
        $result = $this->jsondecode()->verify(new sha256(), $this->secrect);
        return $result;
    }
 
}

user.php 用来测试

<?php
namespace app\index\controller;
use app\common\auth\jwtauth;
 
class user{
 
    public function login(){
        
        $jwtauth = jwtauth::getinstance();
        $token = $jwtauth->setuid(1)->encode()->gettoken();
        echo $token;
        // var_dump(success_json_data(['token'=>$token]));
    }
 
    public function check_login(){
        $jwtauth = jwtauth::getinstance();
        $jwtauth->settoken('eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjpc3mioijhcgkudgvzdc5jb20ilcjhdwqioijhchauy29tiiwiawf0ijoxntu2mdk1mdi5lcjlehaioje1ntywotuwndksinvpzci6mx0.oi4rlbqfnzujsw4fvhwioqxfemomuvldav-gfkl2v74');
 
        if($jwtauth->validate() && $jwtauth->verify()){
            echo '验证成功';
        }else{
            echo '登录过期';
        }
 
    }
}

最后

jwt本身的话是不带token刷新方法,所以一旦token过期,客户端就要重新登录。