关于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. 用python制作信贷审批监测表
  2. 计算机专业需要学好的数学知识,学好数学对计算机专业重要吗?
  3. markdown数学公式手册
  4. 三菱socket通信实例_三菱QUnCPU内置以太网Socket通信(TCP篇)
  5. Oracle_忘记密码
  6. Autodesk 2014 系列软件通用注册机使用方法:
  7. Symantec赛门铁克安全软件免密卸载方式
  8. java new string编码_Java String 类型编码转换
  9. vijos 1071 01背包
  10. AM3352 bootloader引导程序开发
  11. [Axure RP9] Axure RP Prototyping: Noob to Master 学习笔记
  12. 服务器防火墙的作用是什么?如何设置?
  13. 计算机里面的Profile怎么翻译比较好?
  14. 乳清蛋白和支链氨基酸不得不说的关系
  15. NaN 是什么 NaN == NaN ?
  16. 2021年第六届数维杯B题 中小城市地铁运营与建设优化设计
  17. 华为汽车BU业务布局及分析框架
  18. python创建目录(文件夹)
  19. Hbase与Oracle比较(列式数据库与行式数据库)
  20. 金庸的小说人生(1)

热门文章

  1. Canal监听mysql的binlog日志实现数据同步
  2. 电商信用流行造假 央视315曝光刷单黑产
  3. Python的一些基础课笔记(函数)
  4. 已帮助上千人成功入职2022软件测试面试自我介绍,软件测试常见面试题
  5. 被公司劝退,领导让我请假出去找工作,找到新工作后,他却让我把离职原因写成个人原因!...
  6. 每次下载的word excel都要通过属性解除锁定才能打开,怎么才能以后下载直接打开呀??
  7. c++ vs2013-poco使用说明
  8. mac最新系统10.10.4下载地址
  9. SYN攻击(DDOS攻击的一种)
  10. 海龙灯具城附近的计算机学校在哪里,海龙灯饰城