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 5.0创建图形的巧妙方法
Oct 12 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
php入门学习知识点四 PHP正则表达式基本应用
Jul 14 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 PHP
PHP里的中文变量说明
Jul 23 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
php提交post数组参数实例分析
Dec 17 PHP
Yii框架分页实现方法详解
May 20 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
Oct 16 PHP
tp5框架的增删改查操作示例
Oct 31 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多层数组与对象的转换实例代码
2013/08/05 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python Logging 日志记录入门学习
2018/06/02 Python
flask中的wtforms使用方法
2018/07/21 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
Python PIL图片添加字体的例子
2019/08/22 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
详解Scrapy Redis入门实战
2020/11/18 Python
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
离婚协议书范本样本
2014/08/19 职场文书
解除劳动合同证明书
2014/09/26 职场文书
《云雀的心愿》教学反思
2016/02/23 职场文书