💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# :-: **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" } ~~~