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


Posted in PHP onJune 03, 2020

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

JWT下载地址:https://jwt.io

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

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
最简单的PHP程序--记数器
Oct 09 PHP
php socket方式提交的post详解
Jul 19 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
php反射应用示例
Feb 25 PHP
php查找字符串出现次数的方法
Dec 01 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
PHP获取真实IP及IP模拟方法解析
Nov 24 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 #PHP
Thinkphp5框架中引入Markdown编辑器操作示例
Jun 03 #PHP
PHP数组基本用法与知识点总结
Jun 02 #PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 #PHP
PHP与Web页面交互操作实例分析
Jun 02 #PHP
PHP Web表单生成器案例分析
Jun 02 #PHP
一文看懂PHP进程管理器php-fpm
Jun 01 #PHP
You might like
PHP开发框架总结收藏
2008/04/24 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
详解用python生成随机数的几种方法
2019/08/04 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
np.dot()函数的用法详解
2020/01/17 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
小车司机岗位职责
2013/11/25 职场文书
教育局长自荐信范文
2013/12/22 职场文书
办理生育手续介绍信
2014/01/14 职场文书
2014年师德承诺书
2014/05/23 职场文书
办理护照工作证明
2014/10/10 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
2015年手术室工作总结
2015/05/11 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python