# :-: **php-jwt用户认证**
## 介绍
全称JSON Web Token,[基于JSON的开放标准((RFC 7519)](https://tools.ietf.org/html/rfc7519) ,以token的方式代替传统的Cookie-Session模式,用于各服务器、客户端传递信息签名验证。
## 优点
1:服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。
2:jwt构成简单,占用很少的字节,便于传输。
3:json格式通用,不同语言之间都可以使用。
## JWT组成
1:jwt由三部分组成:
头部(header)
载荷(payload) 包含一些定义信息和自定义信息
签证(signature)
2:具体构成:
header:
```
{
"type" : "JWT", //声明类型jwt
"alg" : "HS256" //声明签名算法为 SHA256
}
```
载荷(payload)
```
{
"iss": "qdzg.ctvit.tv",
"aud": "qdzg.ctvit.tv",
"iat": 1617001883
"nbf": 1617001883
"exp": 1617001943
"data": {
"userid": 1,
"username": "小名"
}
}
```
载荷包括两部分:标准声明和其他声明。
标准声明:JWT标准规定的声明,但不是必须填写的;
标准声明字段:
接收该JWT的一方
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,过期时间必须要大于签发时间
nbf: 定义在什么时间之前,某个时间点后才能访问
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token。
其他声明:自己定义的字段,因为这部分是可以解开的,建议不要加入敏感信息,这里的data就是我自己定义的声明
## 使用
php 有很多jwt的包,本人使用的是 Firebase\JWT ,具体自己想使用那个包可以自己去github官网下载
1:使用composer 拉取组件,如果没有装composer的 先安装composer 并配置环境变量
```
composer require firebase/php-jwt
```
执行完命令 如果命令行有如下输出则说明安装成功
```
Using version ^5.2 for firebase/php-jwt
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing firebase/php-jwt (v5.2.1): Downloading (100%)
Package phpoffice/phpexcel is abandoned, you should avoid using it. Use phpoffice/phpspreadsheet instead.
Writing lock file
Generating autoload files
```
2:生成token
```
namespace app\index\controller;
use Firebase\JWT\JWT;
class Index
{
public function index(){
$key = 'ctvit.tv'; //key
$time = time();//当前时间
$data = array(
'iss' =>'qdzg.ctvit.tv',//签发者 可选
'aud' => 'qdzg.ctvit.tv',//接收该JWT的一方,可选
'iat' =>$time,//签发时间
'nbf' => $time,//(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
'exp' =>$time + 60,//过期时间,这里设置2个小时
'string'=>'qdzg.ctvit.tv',//自定义信息,不要定义敏感信息
);
$jwt = JWT::encode($data,$key,'HS256');
dump($jwt);
}
}
```
3:解析token 因为是测试demo 所以直接写签名
```
<?php
namespace app\index\controller;
use Firebase\JWT\JWT;
class Index
{
public function test(){
$key = 'ctvit.tv';
$jwt = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJxZHpnLmN0dml0LnR2IiwiYXVkIjoicWR6Zy5jdHZpdC50diIsImlhdCI6MTYxNzAwMTg4MywibmJmIjoxNjE3MDAxODgzLCJleHAiOjE2MTcwMDE5NDMsInN0cmluZyI6InFkemcuY3R2aXQudHYifQ.aS_BX36WrkeGX9r9P_TeN7E0WZU67C6uQOe-W4ZcfEg';
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($jwt,$key,['HS256']);
dump((array)$decoded);
}
}
```
上面代码的输出结果
~~~
array(6) {
["iss"] => string(13) "qdzg.ctvit.tv"
["aud"] => string(13) "qdzg.ctvit.tv"
["iat"] => int(1617001883)
["nbf"] => int(1617001883)
["exp"] => int(1617001943)
["string"] => string(13) "qdzg.ctvit.tv"
}
~~~