关于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 在项目中的实际使用相关推荐

  1. 使用spring boot+shiro+jwt+mybatis-plus搭建项目框架

    1.创建spring boot项目,并导入依赖 pom.xml <dependencies><dependency><groupId>org.springframe ...

  2. SpringBoot项目使用JWT+拦截器实现token验证

    利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...

  3. Only老K说-spa项目实现jwt验证码

    博客目标 实现思路 第一阶段,实现页面显示验证码 第二阶段:登录同时判断验证码 实现思路 登录界面向后台请求验证码,后台就先调用随机函数生成验证码,并且根据验证码生成一张图片,以 base64 字符串 ...

  4. vue使用命令行构建完项目后_vue-cli 构建项目在IE中无法运行解决方式(build之后可运行)...

    IE浏览器(只考虑IE11,更低版本我没考虑)运行时报 Promise未定义的错误 解决办法: 1. 安装babel-polyfill (1.)  npm install babel-polyfill ...

  5. Visual Stdio 无法直接启动带有“类库输出类型”的项目若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项目!

    Visual Stdio 无法直接启动带有"类库输出类型"的项目若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目.将这个可执行项目设置为启动项目! 参考文章: (1) ...

  6. eclipse中一个项目引用另一个项目的方法

    我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...

  7. rn项目 假如cocoapods_在项目中集成 RN

    在项目中集成 RN 19 Jan 2017 前言 使用 RN 难道要把整个项目都重构一遍么?教程那么多,但是很少能够有把怎么与当前项目结合起来的文章.自己摸索了一遍,记录下来.之后的 RN 之路就由此 ...

  8. Vue.js-Day07【项目实战(附带 完整项目源码)-day02:学习能力、字体图标(使用步骤)、在vue.js中使用jQuery】

    Vue.js实训[基础理论(5天)+项目实战(5天)]博客汇总表[详细笔记] 实战项目源码[链接:https://pan.baidu.com/s/1r0Mje3Xnh8x4F1HyG4aQTA   提 ...

  9. 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 东方不能 ...

  10. vs2019中如何创建qt项目_在VS2015中创建Qt项目【VS+Qt项目开发系列】(二)

    在VS2015中创建Qt项目[VS+Qt项目开发系列](二) 发布时间:2018-04-20 22:44, 浏览次数:1269 , 标签: VS Qt 在上一篇[VS+Qt项目开发](一)在VS201 ...

最新文章

  1. Hadoop自带的一些程序示例
  2. jasperreports_JasperReports JSF插件用例–简单列表报告
  3. JacksonUtils Jackson的JSON序列化反序列化
  4. 只要 8 个步骤,学会这个 Docker 命令终极教程!
  5. python文字游戏 生成数字菜单_pygame游戏之旅 游戏中添加显示文字
  6. javascript !-- //-- 与老的浏览器打交道
  7. sqlserver监控(备忘)
  8. spring基于注解的 IOC 配置ioc实现crud
  9. C#下开发及调用dll文件
  10. atitit 数据库mysq启动不起来解决方案.docx
  11. 【转】程序员:如何写出杀手级简历
  12. 环洋市场咨询:全球EMS和ODM收入预计2028年达到7978.5亿美元
  13. 【SQL】实验九 视图的使用
  14. 波士顿学院计算机,波士顿学院(Boston College)_快飞留学
  15. 打破清晨喧嚣的 oom
  16. 只有你能听见(Calling you)2
  17. 现在玩cf的计算机配置要求,穿越火线电脑配置要求-玩CF所需的电脑配置
  18. [Android][sensor]物理sensor bring up流程
  19. 自行車基本知識 (zz)
  20. 银行ATM存取款页面简易版练习(python)

热门文章

  1. pom env.java home_maven 内置pom属性(示例代码)
  2. 爆强,某人上课无聊用圆珠笔画出来的风景画(转载)
  3. 互联网资讯:闲鱼推出“无忧购”“会玩社区”“新线下”三大业务
  4. UE4:AI‘s MoveTo——代码分析
  5. 最新数据, 芯片工程师平均月薪高达2.56W !
  6. Android ---facebook/litho框架 超实用的入门干货
  7. (47)Linux命令【free命令】
  8. 程序员哇,你想在下个情人节或者520脱单么?这个秘籍不能错过
  9. mysql截取点前面两位的字符串,Mysql字符串截取函数SUBSTRING的用法说明
  10. Android N的Audio系统(五)