PHP 之 JWT
时间:2020-03-26
本文章向大家介绍PHP 之 JWT,主要包括PHP 之 JWT使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.JWT 网址:https://packagist.org/packages/tymon/jwt-auth
composer require tymon/jwt-auth dev-master
调用:
$data = TokenService::getToken($adminFind);
<?php namespace App\Common\Services; use App\Common\Model\Admin; use App\Exceptions\ParamException; use App\Exceptions\TokenException; use App\Exceptions\TokenRefreshException; use Firebase\JWT\JWT; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Request; class TokenService { /** * @param $cacheValue * @return string|null * @throws ParamException * @author: deng (2020/2/12 11:57) */ public function createToken($cacheValue) { // key $key = $this->createStr(); // value 数组格式转换json字符串 $value = json_encode($cacheValue); // time $expire_in = Config::get('web.token_expire_in'); // 添加到缓存中 $result = Cache::put($key, $value, $expire_in); if (!$result) { throw new ParamException('服务器缓存异常'); } return $key; } /** * @return string|null */ public function createStr() { $length = 30; $str = null; $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; $max = strlen($strPol) - 1; for ($i = 0; $i < $length; $i++) { $str .= $strPol[rand(0, $max)]; } return $str; } /** * JWT 创建jwt入口 * * @param $user * @return array * @author: deng (2020-03-11 15:09) */ public static function getToken($user) { // 访问的令牌 $accessToken = self::createAccessToken($user); // 刷新的令牌 $refreshToken = self::createRefreshToken($user); return [ 'access_token' => $accessToken, 'refresh_token' => $refreshToken ]; } /** * 访问的令牌 * * @param $user * @return mixed * @author: deng (2020-03-11 15:10) */ private static function createAccessToken($user) { $key = config('secure.access_token_salt'); $payload = [ 'iss' => 'lin-cms-tp5', //签发者 'iat' => time(), //什么时候签发的 'exp' => time() + 7200, //过期时间 'user' => $user, ]; return JWT::encode($payload, $key); } /** * @param $user * @return mixed * @author: deng (2020-03-11 15:10) */ private static function createRefreshToken($user) { $key = config('secure.refresh_token_salt'); $payload = [ 'iss' => 'lin-cms-tp5', //签发者 'iat' => time(), //什么时候签发的 'exp' => time() + 604800, //过期时间,一个星期 'user' => ['id' => $user->id], ]; return JWT::encode($payload, $key); } /** * @return array * @throws ParamException * @throws TokenException */ public static function refreshToken() { try { $user_id = self::getCurrentTokenVar('id','refresh_token_salt'); $user = Admin::query()->find($user_id); $accessToken = self::createAccessToken($user); } catch (TokenException $ex) { throw new TokenException($ex->msg); } return [ 'access_token' => $accessToken, ]; } /** * @return mixed * @throws ParamException * @throws TokenException * @author: deng (2020-03-11 20:10) */ public static function getTokenJwtId() { return self::getCurrentTokenVar('id'); } /** * @param $key * @param string $tokenType * @return mixed * @throws ParamException * @throws TokenException * @author: deng (2020-03-11 20:08) */ private static function getCurrentTokenVar($key, $tokenType = 'access_token_salt') { $authorization = Request::header('authorization'); if (!$authorization) { throw new TokenException('请求未携带Authorization信息'); // throw new TokenException(['msg' => '请求未携带Authorization信息']); } list($type, $token) = explode(' ', $authorization); if ($type !== 'Bearer') throw new TokenException('接口认证方式需为Bearer'); if (!$token || $token === 'undefined') { throw new TokenException('尝试获取的Authorization信息不存在'); } $secretKey = config("secure.{$tokenType}"); try { $jwt = (array)JWT::decode($token, $secretKey, ['HS256']); } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 throw new TokenException('令牌签名不正确,请确认令牌有效性或令牌类型'); } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 throw new TokenException('令牌尚未生效'); } catch (\Firebase\JWT\ExpiredException $e) { // token过期 throw new TokenRefreshException('令牌已过期,刷新浏览器重试'); // throw new TokenException('令牌已过期,刷新浏览器重试', 10050); } catch (\Exception $e) { //其他错误 throw new ParamException($e->getMessage()); } if (array_key_exists($key, $jwt['user'])) { return $jwt['user']->$key; } else { throw new TokenException('尝试获取的Token变量不存在'); } } }
原文地址:https://www.cnblogs.com/vip-deng-vip/p/12577001.html
- Java与js的交互
- Rafy 框架 - 流水号插件
- 产品前端重构(TypeScript、MVC框架设计)
- 寻找最优持仓期的开盘缺口盈利交易策略基于Matlab
- Android SlidingMenu 侧拉菜单的使用(详细配置)
- Rafy 框架 - 幽灵插件(假删除)
- 用粒子群优化算法求解旅行商问题
- 使用CNN(LSTM架构)进行序列预测基于TensorFlow
- 【独家】周志华教授gcForest(多粒度级联森林)算法预测股指期货涨跌
- 如何利用SOTER,1个版本内完成指纹支付开发?
- Rafy 框架 - 大批量导入实体
- Rafy 框架 - 执行SQL或存储过程
- 关于activitygroup过时,用frament替换操作
- Rafy 框架 - 为数据库生成注释
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 二分练习 --D - Trailing Zeroes (III)
- HDU 5806
- B - They Are Everywhere CodeForces - 701C
- 尺取练习 -A - A - Stages (水题压压惊)
- 填坑-回溯-预习 之 二分-尺取大总结
- 深入浅出理解动态规划(一) | 交叠子问题
- 深入浅出理解动态规划(二) | 最优子结构
- 用x种方式求第n项斐波那契数,99%的人只会第一种
- 面试官:手撕十大排序算法,你会几种?
- 如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据?
- Java开发岗面试题--基础篇(一)
- leetcode链表之找出倒数第k个节点
- MAC下安装nginx的正确姿势 实践笔记
- 关于 ThreadLocal 你需要知道的几点
- 关于Guava ForwardingMap