thinkphp3 php jwt,thinkphp框架使用JWTtoken的方法详解

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

简介

一:JWT介绍:全称JSON Web Token,基于JSON的开放标准((RFC 7519) ,以token的方式代替传统的Cookie-Session模式,用于各服务器、客户端传递信息签名验证。

二:JWT优点:

1:服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。

2:jwt构成简单,占用很少的字节,便于传输。

3:json格式通用,不同语言之间都可以使用。

三:JWT组成

1:jwt由三部分组成:

头部(header)

载荷(payload) 包含一些定义信息和自定义信息

签证(signature)

2:具体构成:

header:

{

"typ": "JWT", //声明类型为jwt

"alg": "HS256" //声明签名算法为SHA256

}

载荷(payload)

{

"iss": "http://www.helloweba.net",

"aud": "http://www.helloweba.net",

"iat": 1525317601,

"nbf": 1525318201,

"exp": 1525318201,

"data": {

"userid": 1,

"username": "李小龙"

}

}

载荷包括两部分:标准声明和其他声明。

标准声明:JWT标准规定的声明,但不是必须填写的;

标准声明字段:

接收该JWT的一方

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,过期时间必须要大于签发时间

nbf: 定义在什么时间之前,某个时间点后才能访问

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token。

下载

composer require firebase/php-jwt

extend 下创建token类

namespace Token;

use think\Controller;

use think\facade\Request;

use Firebase\JWT\JWT;

/**token类

* Class Token

* @package app\api\Controller

*/

class Token

{

/**

* 创建 token

* @param array $data 必填 自定义参数数组

* @param integer $exp_time 必填 token过期时间 单位:秒 例子:7200=2小时

* @param string $scopes 选填 token标识,请求接口的token

* @return string

*/

private $TokenKey = "123456";

public function createToken($data="",$exp_time=0,$scopes=""){

//JWT标准规定的声明,但不是必须填写的;

//iss: jwt签发者

//sub: jwt所面向的用户

//aud: 接收jwt的一方

//exp: jwt的过期时间,过期时间必须要大于签发时间

//nbf: 定义在什么时间之前,某个时间点后才能访问

//iat: jwt的签发时间

//jti: jwt的唯一身份标识,主要用来作为一次性token。

//公用信息

try {

$key=$this->TokenKey;

$time = time(); //当前时间

//$token['iss']=''; //签发者 可选

//$token['aud']=''; //接收该JWT的一方,可选

$token['iat']=$time; //签发时间

$token['nbf']=$time; //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用

if($scopes){

$token['scopes']=$scopes; //token标识,请求接口的token

}

if(!$exp_time){

$exp_time=7200;//默认=2小时过期

}

$token['exp']=$time+$exp_time; //token过期时间,这里设置2个小时

if($data){

$token['data']=$data; //自定义参数

}

$json = JWT::encode($token,$key);

$returndata['status']="200";//

$returndata['msg']='success';

$returndata['token']= $json;//返回的数据

return $returndata; //返回信息

}catch(\Firebase\JWT\ExpiredException $e){ //签名不正确

$returndata['status']="104";//101=签名不正确

$returndata['msg']=$e->getMessage();

$returndata['data']="";//返回的数据

return $returndata; //返回信息

}catch(\Exception $e) { //其他错误

$returndata['status']="199";//199=签名不正确

$returndata['msg']=$e->getMessage();

$returndata['data']="";//返回的数据

return $returndata; //返回信息

}

}

/**

* 验证token是否有效,默认验证exp,nbf,iat时间

* @param string $jwt 需要验证的token

* @return string $msg 返回消息

*/

public function checkToken($jwt){

$key=$this->TokenKey;

try {

JWT::$leeway = 60;//当前时间减去60,把时间留点余地

$decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应

$arr = (array)$decoded;

$returndata['status']="200";//200=成功

$returndata['msg']="success";//

$returndata['data']=$arr;//返回的数据

return $returndata; //返回信息

} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确

$returndata['status']="101";//101=签名不正确

$returndata['msg']=$e->getMessage();

$returndata['data']="";//返回的数据

//return json_encode($returndata); //返回信息

//exit(json_encode($returndata));

sendResponse($returndata,401,'Unauthorized');

}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用

$returndata['status']="102";

$returndata['msg']=$e->getMessage();

$returndata['data']="";//返回的数据

sendResponse($returndata,401,'Unauthorized');

}catch(\Firebase\JWT\ExpiredException $e) { // token过期

$returndata['status']="103";//103=签名不正确

$returndata['msg']=$e->getMessage();

$returndata['data']="";//返回的数据

sendResponse($returndata,401,'Unauthorized');

}catch(\Exception $e) { //其他错误

$returndata['status']="199";//199=签名不正确

$returndata['msg']=$e->getMessage();

$returndata['data']="";//返回的数据

sendResponse($returndata,401,'Unauthorized');

}

//Firebase定义了多个 throw new,我们可以捕获多个catch来定义问题,catch加入自己的业务,比如token过期可以用当前Token刷新一个新Token

}

签发

$jwtToken = new Token();

$tokenData = array(

'openid' => $user->getId(),

'uniacid' => $_W['uniacid'],

);

$token = $jwtToken->createToken($tokenData)

验证

if (empty($_SERVER['HTTP_AUTHORIZATION']))

{

$res['status']="201";

$res['msg']="no token";

$res['data']="";//返回的数据

sendResponse($res,401,'Unauthorized');

}

$token = $_SERVER['HTTP_AUTHORIZATION'];

$jwtToken = new Token();

$checkToken = $jwtToken->checkToken($token);

$data = (array)$checkToken['data']['data'];

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 64位编码解码,php base64 编码和解码

/*** 自定义规则方式编码和解码**/public function test_changinttoStr () {$intvalue1 1232344234;$intStr ;$str "Y 9 L F k g y 5 R o v i x I 1 a O f 8 U h d s 3 r 4 D M p l Q Z J X P q e b E 0 W S j B n 7 w V z m N 2 G c 6 T H C A K u t";$seq expl…

matlab能力处理,书+程序《MATLAB图像处理:能力提高与应用案例》赵小川

【实例简介】MATLAB图像处理能力提高与应用案例 [赵小川 编著] 2014年版,书程序(仅供学习)【实例截图】【核心代码】c3c59b5e-16c1-4bda-938e-8fcfb2ff870d└── 《MATLAB图像处理:能力提高与应用案例》书程序├── 1.1 图像多分辨率金字塔.zip├── 1.2图像的矩…

wamp php启动不成功,wamp的mysql 启动失败解决

wamp启动失败,查看原因是mysql 启动失败首先查看mysql的启动日志命令:mysqld --console知道error报错的地方:然后百度了此报错,解决方法在my.ini中添加innodb_force_recovery 1发现这个会影响insert需要设置为 innodb_force_reco…

php复选框样式,如何自定义checkbox样式?附代码

本篇文章给大家带来的内容是关于如何自定义checkbox样式?附代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。修改原生checkbox样式。效果原理1.利用CSS3属性 appearance。该属性(强制)更改(改变)默认(原生)样式…

JAVA用数据留给出师表排序,如果诸葛亮会编程,用Java写出师表...

继上一篇 "如果诸葛亮用C#写出师表..."后,站长想自己的第一语言是Java,虽然平时工作上用的不多,也用Java实现一遍吧,改改就是了,无非就是:C#的Console.WriteLine改为Java的System.out.println;C#…

python 横坐标旋转,python 横坐标旋转

数据旋转公式x1cos(angle)*x-sin(angle)*y;y1cos(angle)*ysin(angle)*x;从数学上来说,此公式可以用来计算某个点绕另外一点旋转一定角度后的坐标,例如:A(x,y)绕B(a,b)旋转β度后的位置为C(c,d),…

php 数组区删除重复的,php – 从数组中删除重复的项目

我使用下面的代码行来遍历数据库中的一个表:$items_thread $connection -> fetch_all($sql);如果我打印出来的阵列:print_r($items_thread);我会得到这个:Array([0] > Array([RecipientID] > 3[RecipientScreenname] > Tom L[Re…

python计算器教程,用Python程序制作一个简单的计算器

用Python程序制作一个简单的计算器在此示例中,您将学习创建一个简单的计算器,该计算器可以根据用户的输入进行加,减,乘或除。要理解此示例,您应该了解以下Python编程主题:通过函数创建简单计算器示例# 程序…

oracle表重命名 索引,CSS_在Oracle数据库中按用户名重建索引的方法,如果你管理的Oracle数据库下某 - phpStudy...

在Oracle数据库中按用户名重建索引的方法如果你管理的Oracle数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的.它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小.在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放.重建索引可以…

ora-01113 oracle8i,ora-01113解决办法

今天在检查接口机的时候,发现速度奇慢,于是,就差了一下v$session表,可是很不幸,查询的速度慢的要命,原来的前几天备份的时候出现的问题,没办法,关闭后重其一次吧,可是关闭…

oracle更换rac节点,Oracle-rac 更改VIP地址—2节点的

1、主机名规划:--更改前:#Public Network - (eth0)ITPUB个人空间8Aw I"PbAv192.168.10.11 rac1G&n&uwk%m11386773192.168.10.12 rac2#Private Interconnect - (eth1)[V/{h4D(*f1L!J1138677310.10.10.11 rac1privH9RI(H/d.cP*UY1138677310.1…

Linux部署oracle11g,linux环境下部署Oracle11g

一、部署准备1、查看本地ssh服务Linux系统下安装启动ssh服务:1.检查是否装了SSH包rpm-qa |grep ssh2.没有安装SSH直接YUM安装yuminstall openssh-server3.检查SSH服务是否为开机启动chkconfig--list sshd4.设置开机启动SSH服务chkconfig--level 2345 sshd on5.重新启…

php yii把pdf转成图片,yii实现图片上传及缩略图生成的方法

这篇文章主要介绍了yii实现图片上传及缩略图生成的方法,详细分析了图片的上传及缩略图的生成原理与实现方法,是非常实用的技巧,需要的朋友可以参考下本文实例讲述了利用yii框架来实现图片上传功能并在上传成功之后自动生成缩略图的方法,分享给大家供大家参考。具体实…

linux下的安装命令行工具下载,linux系统程序安装(二)yum工具2-yum源及包下载

继续我们的yum工具应用之旅,yum工具之所以方便就是因为有方便的在线云库,实际工作中我们可能没办法链接互联网,或者我们想安装的程序原生源那么我们能不能用其他方式应用方便的yum源呢?一、使用光盘作为yum源1、将光盘挂载到/mnt目…

linux显卡内核修改,iTOP-4412开发板-驱动-linux显卡驱动的修改方法

本文档介绍迅为4412开发板的显卡分辨率修改方法。iTOP-4412 开发板支持 4.3 寸、7 寸和 9.7 寸等 lcd 显示屏。其中 4.3 寸屏是用的 cpu直接出来的 RGB 信号,7 寸屏和 9.7 寸屏是用的 LVDS 信号,硬件上使用了一个 RGB 转LVDS 的芯片实现的。我们来看下显…

linux-如何限制普通用户的磁盘使用空间-磁盘配额quota,Linux系统下如何进行磁盘配额Quota的设置...

Linux如何进行磁盘配额quota的设置通过quota进行磁盘配额,可以控制用户对磁盘空间和文件的控制,我们以一个实例作为说明,对2个用户user01、user02分别进行磁盘使用空间和创建文件的限制。首先,创建一个新的分区&#x…

linux一台机器如何安装两个mysql,在一台linux机器上启动两个mysql实例

环境:linux主机上已经yum安装了mysql,而且数据库正在运行。在不关闭/重启mysql的情况下,重新启动一个新的mysql实例,使用3307端口,实现一台机器上同时运行两个数据库实例。1、创建新的mysql实例数据存储目录&#xff1…

linux和windows启动,Linux和Windows双系统的启动

问题Linux和Windows双系统的启动解决方案在某些特殊情况下,服务器可能要安装双系统一个linux系统,一个windows系统这种情况下,安装顺序是,先装Windows系统,后装Linux这是因为,Linux的引导程序grub具备多系统…

体积最小桌面linux,Tiny Core Linux - 体积最小的精简 Linux 操作系统发行版之一 (仅10多MB)...

Tiny Core Linux (TCL) 是一款极体积极小且高度可扩展的微型 Linux 发行版,它将一个 Linux 操作系统精简到仅有 10 多 MB 左右的大小,似乎小巧得有点让人叹为观止!要知道无论是常见的 Ubuntu、CentOS、Debian 的体积动辄就是几百MB甚至要上GB…

linux下缓存命中测试,Linux 性能优化实战(倪朋飞)---查看缓存命中情况

cachestat 提供了整个操作系统缓存的读写命中情况。cachetop 提供了每个进程的缓存命中情况。但是,cachetop 并不把直接 I/O 算进来。安装 cachestat、cachetop:$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD$ ech…