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 ...
最新文章
- Hadoop自带的一些程序示例
- jasperreports_JasperReports JSF插件用例–简单列表报告
- JacksonUtils Jackson的JSON序列化反序列化
- 只要 8 个步骤,学会这个 Docker 命令终极教程!
- python文字游戏 生成数字菜单_pygame游戏之旅 游戏中添加显示文字
- javascript !-- //-- 与老的浏览器打交道
- sqlserver监控(备忘)
- spring基于注解的 IOC 配置ioc实现crud
- C#下开发及调用dll文件
- atitit 数据库mysq启动不起来解决方案.docx
- 【转】程序员:如何写出杀手级简历
- 环洋市场咨询:全球EMS和ODM收入预计2028年达到7978.5亿美元
- 【SQL】实验九 视图的使用
- 波士顿学院计算机,波士顿学院(Boston College)_快飞留学
- 打破清晨喧嚣的 oom
- 只有你能听见(Calling you)2
- 现在玩cf的计算机配置要求,穿越火线电脑配置要求-玩CF所需的电脑配置
- [Android][sensor]物理sensor bring up流程
- 自行車基本知識 (zz)
- 银行ATM存取款页面简易版练习(python)
热门文章
- pom env.java home_maven 内置pom属性(示例代码)
- 爆强,某人上课无聊用圆珠笔画出来的风景画(转载)
- 互联网资讯:闲鱼推出“无忧购”“会玩社区”“新线下”三大业务
- UE4:AI‘s MoveTo——代码分析
- 最新数据, 芯片工程师平均月薪高达2.56W !
- Android ---facebook/litho框架 超实用的入门干货
- (47)Linux命令【free命令】
- 程序员哇,你想在下个情人节或者520脱单么?这个秘籍不能错过
- mysql截取点前面两位的字符串,Mysql字符串截取函数SUBSTRING的用法说明
- Android N的Audio系统(五)