欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ThinkPHP5框架中使用JWT的方法示例

程序员文章站 2022-06-21 08:54:07
本文实例讲述了thinkphp5框架中使用jwt的方法。分享给大家供大家参考,具体如下:jwt下载地址:可以直接去github上下载,也可以使用composer使用composer的话要确保你的电脑上...

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

jwt下载地址:

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

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

创建文件

我是放在common目录下

ThinkPHP5框架中使用JWT的方法示例

使用教程

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过期,客户端就要重新登录。

相关标签: ThinkPHP5 使用JWT