php 项目 jwt,JWT 在项目中的实际使用
关于JWT 可以参考 JWT 完整使用详解 这里说一下在实际项目中的使用:
laravel 5.5
php7.1
"tymon/jwt-auth": "1.*@rc"
JWT token 的刷新 和 基于 JWT 实现单用户登陆
TOKEN 的刷新
理解
用户登陆后 获取到 tokenA (这个时候 tokenA 的有效期是60分钟)
通过 tokenA 获取到 tokenB (这个时候 tokenB 的有效期是60分钟,tokenA 开始进行 60秒的 倒计时,60秒后就会被拉黑)
tokenB 换取 tokenC (成功后 tokenB 开始进行60秒倒计时,60秒后会被拉黑)
env 配置如下:
JWT_SECRET=jbSn01PbHsFoRzEqHtuOsM3rV3FCsGcI
JWT_BLACKLIST_ENABLED=true # 是否开启toekn黑名单 生产环境需要开启 宽限时间需要开启黑名单(默认是开启的),黑名单保证过期token不可再用,最好打开
JWT_BLACKLIST_GRACE_PERIOD=60 # 设定宽限时间,单位:秒
JWT_REFRESH_TTL=20160 # 刷新时间 单位:分钟
JWT_TTL=60 # 有效时间 单位:分钟
单用户登陆
基于 JWT token 的单用户登陆, 在 token 的载荷配置中做一点手脚即可:
namespace App\Http\Controllers;
use Auth;
use App\Business\UserBusiness;
use App\Transformers\UserTransformer;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Facades\JWTFactory;
/**
* 用户相关
*
* @Resource("user", uri="/api")
*/
class UserController extends Controller
{
protected $userBusiness;
/**
* UserController constructor.
* @param UserBusiness $userBusiness
*/
public function __construct(UserBusiness $userBusiness)
{
$this->userBusiness = $userBusiness;
}
/**
* 用户登陆
*
* 使用 `username` 和 `password` 进行登陆。
*
* @Post("/login")
* @Versions({"v1"})
* @Transaction({
* @Request({"username": "foo", "password": "bar"}),
* @Response(200, body={"code":1,"time":"2018-08-10 09:32:44","message":"success","data":{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9hcGkuc21hcnR2aWRlby5jb21cL2FwaVwvbG9naW4iLCJpYXQiOjE1MzM4NjQ3NjQsImV4cCI6MTUzMzg2ODM2NCwibmJmIjoxNTMzODY0NzY0LCJqdGkiOiJsZTJObzRLVDZlT0NyVnZCIiwic3ViIjoiZGVkZjYyZTI5MDA0MTFlODgzM2I1NGVlNzVlNTM1MzciLCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.OdJlE_pUuttqIxsjKF-FAcZOhMYitS69fh18lPZAYmQ","token_type":"bearer","expires_in":3600}}),
* @Response(200, body=
* {
* "message": "用户不存在",
* "code": 4000,
* "status_code": 500
* }
* )
*
* })
*/
public function login(Request $request)
{
$rules = [
'username' => 'required',
'password' => 'required'
];
$this->_validate($request, $rules);
$spbill_create_ip = $request->header('x-real-ip')?: $request->ip();
iLog('----------spbill_create_ip------------'. $spbill_create_ip);
$username = $request->username;
$password = $request->password;
$login_time = time();
$user = $this->userBusiness->dologin($username,$password,$spbill_create_ip,$login_time);
// Get the token
$factory = JWTFactory::customClaims([
'sub' => $user->guid,
'ip' => $spbill_create_ip,
'login_time' => $login_time
]);
$payload = $factory->make();
$token = JWTAuth::encode($payload);
return $this->_response($this->respondWithToken((string)$token));
}
protected function respondWithToken($token)
{
return [
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => JWTAuth::factory()->getTTL() * 60
];
}
}
namespace App\Http\Middleware;
use App\Business\ResponseException;
use App\Common\ResponseCode;
use Closure;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
class ClientCheck extends BaseMiddleware
{
/**
* @param $request
* @param Closure $next
* @return mixed
* @throws ResponseException
*/
public function handle($request, Closure $next)
{
$array = $this->auth->payload()->jsonSerialize();
$user = $this->auth->user();
if (key_exists('ip',$array) && key_exists('login_time',$array)) {
if ($array['ip'] != $user->ip || $array['login_time'] != $user->login_at) throw new ResponseException("该账户已在其他设备登陆",ResponseCode::OTHER_CLIENT_LOGIN);
}
return $next($request);
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
php 项目 jwt,JWT 在项目中的实际使用相关推荐
- 使用spring boot+shiro+jwt+mybatis-plus搭建项目框架
1.创建spring boot项目,并导入依赖 pom.xml <dependencies><dependency><groupId>org.springframe ...
- SpringBoot项目使用JWT+拦截器实现token验证
利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...
- Only老K说-spa项目实现jwt验证码
博客目标 实现思路 第一阶段,实现页面显示验证码 第二阶段:登录同时判断验证码 实现思路 登录界面向后台请求验证码,后台就先调用随机函数生成验证码,并且根据验证码生成一张图片,以 base64 字符串 ...
- vue使用命令行构建完项目后_vue-cli 构建项目在IE中无法运行解决方式(build之后可运行)...
IE浏览器(只考虑IE11,更低版本我没考虑)运行时报 Promise未定义的错误 解决办法: 1. 安装babel-polyfill (1.) npm install babel-polyfill ...
- Visual Stdio 无法直接启动带有“类库输出类型”的项目若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项目!
Visual Stdio 无法直接启动带有"类库输出类型"的项目若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目.将这个可执行项目设置为启动项目! 参考文章: (1) ...
- eclipse中一个项目引用另一个项目的方法
我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...
- rn项目 假如cocoapods_在项目中集成 RN
在项目中集成 RN 19 Jan 2017 前言 使用 RN 难道要把整个项目都重构一遍么?教程那么多,但是很少能够有把怎么与当前项目结合起来的文章.自己摸索了一遍,记录下来.之后的 RN 之路就由此 ...
- Vue.js-Day07【项目实战(附带 完整项目源码)-day02:学习能力、字体图标(使用步骤)、在vue.js中使用jQuery】
Vue.js实训[基础理论(5天)+项目实战(5天)]博客汇总表[详细笔记] 实战项目源码[链接:https://pan.baidu.com/s/1r0Mje3Xnh8x4F1HyG4aQTA 提 ...
- IDEA导入Maven项目,pom.xml文件中 有inspects a maven model for resolution problems报错 !!!!!!!!!!有用
IDEA导入Maven项目,pom.xml文件中 有inspects a maven model for resolution problems报错 2018年08月06日 22:13:09 东方不能 ...
- vs2019中如何创建qt项目_在VS2015中创建Qt项目【VS+Qt项目开发系列】(二)
在VS2015中创建Qt项目[VS+Qt项目开发系列](二) 发布时间:2018-04-20 22:44, 浏览次数:1269 , 标签: VS Qt 在上一篇[VS+Qt项目开发](一)在VS201 ...
最新文章
- 用python制作信贷审批监测表
- 计算机专业需要学好的数学知识,学好数学对计算机专业重要吗?
- markdown数学公式手册
- 三菱socket通信实例_三菱QUnCPU内置以太网Socket通信(TCP篇)
- Oracle_忘记密码
- Autodesk 2014 系列软件通用注册机使用方法:
- Symantec赛门铁克安全软件免密卸载方式
- java new string编码_Java String 类型编码转换
- vijos 1071 01背包
- AM3352 bootloader引导程序开发
- [Axure RP9] Axure RP Prototyping: Noob to Master 学习笔记
- 服务器防火墙的作用是什么?如何设置?
- 计算机里面的Profile怎么翻译比较好?
- 乳清蛋白和支链氨基酸不得不说的关系
- NaN 是什么 NaN == NaN ?
- 2021年第六届数维杯B题 中小城市地铁运营与建设优化设计
- 华为汽车BU业务布局及分析框架
- python创建目录(文件夹)
- Hbase与Oracle比较(列式数据库与行式数据库)
- 金庸的小说人生(1)
热门文章
- Canal监听mysql的binlog日志实现数据同步
- 电商信用流行造假 央视315曝光刷单黑产
- Python的一些基础课笔记(函数)
- 已帮助上千人成功入职2022软件测试面试自我介绍,软件测试常见面试题
- 被公司劝退,领导让我请假出去找工作,找到新工作后,他却让我把离职原因写成个人原因!...
- 每次下载的word excel都要通过属性解除锁定才能打开,怎么才能以后下载直接打开呀??
- c++ vs2013-poco使用说明
- mac最新系统10.10.4下载地址
- SYN攻击(DDOS攻击的一种)
- 海龙灯具城附近的计算机学校在哪里,海龙灯饰城