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 购物车实例(申精)
May 11 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
header跳转和include包含问题详解
Sep 08 PHP
控制PHP的输出:缓存并压缩动态页面
Jun 11 PHP
解析php中static,const与define的使用区别
Jun 18 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
php实现的错误处理封装类实例
Jun 20 PHP
PHP 传输会话curl函数的实例详解
Sep 12 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python ip正则式
2009/05/07 Python
详解python调度框架APScheduler使用
2017/03/28 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python如何判断IP地址合法性
2020/04/05 Python
Python控制台实现交互式环境执行
2020/06/09 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
美德好少年事迹材料
2014/01/19 职场文书
企业消防安全责任书
2014/07/23 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
德能勤绩工作总结
2015/08/11 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android