项目介绍

最近在做一个后台项目,目标是登录后无操作30分钟后自动过期,一直操作的情况下,过期时间一直刷新(目前不考虑每次操作修改对数据库的压力)

token有效期检测

操作后自动刷新过期时间

管理员手动登出其他登录用户

单用户登录,二次登录作废上次登录token

token有效期检测

passport自带就有检测过期时间,这个用过都了解\

文件在League\OAuth2\Server\AuthorizationValidators\BearerTokenValidator

public function validateAuthorization(ServerRequestInterface $request)

{

.

.

.

try {

// Attempt to parse and validate the JWT

// 这里会根据token解析出过期时间

/**

* 内容为这个

* "exp" => Lcobucci\JWT\Claim\GreaterOrEqualsTo^ {#2944

* -name: "exp"

* -value: 1606462560

* }

**/

$token = (new Parser())->parse($jwt);

.

.

.

// Ensure access token hasn't expired

$data = new ValidationData();

$data->setCurrentTime(time());

// 这里验证token是否有效

if ($token->validate($data) === false) {

throw OAuthServerException::accessDenied('Access token is invalid');

}

// Check if token has been revoked

// 这样验证数据库中token是否已经被撤销,会进行一次查询

// 最后验证结束还是查询一次,把查询内容放到auth('api')->user()->token()中

if ($this->accessTokenRepository->isAccessTokenRevoked($token->getClaim('jti'))) {

throw OAuthServerException::accessDenied('Access token has been revoked');

}

.

.

.

}

操作后自动刷新过期时间

这个是目前遇到的问题,在数据库中可以看到oauth_access_tokens中,有 expires_at 字段,理所当然的,请求之后,修改这个过期时间

// $this->loginUser为自定义的,相当于$request->user('api')

$this->loginUser->token()->expires_at = Carbon::now()->addMinutes(30);

$this->loginUser->token()->save();

实际上用该token请求还是没有问题,百思不得其解后,找到问题所在

// Ensure access token hasn't expired

$data = new ValidationData();

$data->setCurrentTime(time());

// 这里验证token是否有效

if ($token->validate($data) === false) {

throw OAuthServerException::accessDenied('Access token is invalid');

}

这里只验证了token中存储的过期时间

if ($this->accessTokenRepository->isAccessTokenRevoked($token->getClaim('jti'))) {

throw OAuthServerException::accessDenied('Access token has been revoked');

}

这里只验证了是否撤销(数据库 revoked 字段)

也就是说根本没有验证数据库的过期字段,再怎么修改过期时间也是无效的(因为只做存储查看作用,没实际验证)\

passport目前想要自己刷新过期时间,又不改变token的情况下,只能进行自定义一个中间件来解决了\

通过 $this->loginUser->token()->expires_at 来获取过期时间,然后自定义处理逻辑

管理员手动登出其他登录用户

这个就比较简单了

DB::table('oauth_access_tokens')->where('user_id', $user->id)

->update([

'revoked' => 1

]);

直接作废该用户的所有 token 就完成了

单用户登录,二次登录作废上次登录token

这个和上面同理,通过 $this->loginUser->token()->getQueueableId() 获取当前登录用户数据库中对应的id

DB::table('oauth_access_tokens')->where('user_id', $this->loginUser->id)

->where('id', '!=', $this->loginUser->token()->getQueueableId())

->update([

'revoked' => 1

]);

直接作废该用户的其他 token 就完成了

目前只能想到通过自定义中间件来处理刷新token有效时间来解决,如果有什么比较好的办法,欢迎讲解!

token 过期刷新令牌_Passport 验证 Token 方法和持续刷新过期时间问题相关推荐

  1. oauth2.0授权协议中刷新令牌refresh token的工作原理及生命周期分析

    在学习oauth2.0协议的时候,对于刷新令牌refresh token感觉很困惑.主要是为啥需要刷新令牌,以及刷新令牌是如何工作的,技术细节是啥?比如通过refresh token可以让access ...

  2. 详解token已过期含义及解决方 token过期是否需要重新登录

    详解token已过期含义及解决方 token过期是否需要重新登录Web应用和用户的身份验证息息相关,从单一服务器架构到分布式服务架构再到微服务架构,用户安全认证和授权的机制也一直在演进,下文对各个架构 ...

  3. 验证token,X_FORWARDED_FOR ,集群,分布式

    目录 自定义认证类,验证token 请求头中:X_FORWARDED_FOR 代之什么? 三种IP具体含义: 集群 ,分布式 集群 分布式 集群和分布式及其区别: 自定义认证类,验证token imp ...

  4. 微信开发之easyWchat服务器配置验证Token失败原因及解决办法

    之前的服务器域名修改了,需要重新获取服务器相关的配置,遇到的问题就是验证Token失败,从以下几点去查找原 因: ①是否设置域名白名单: ②是否设置安全域名: ③访问验证Token的路径是否正确: 经 ...

  5. 为什么 OAuth 里除了 Access Token 之外,还需要 Refresh Token?

    What is the purpose of a "Refresh Token"? 问题:我有一个与 YouTube Live Streaming API 集成的程序.我以每 50 ...

  6. jwt token注销_详解JWT token心得与使用实例

    本文你能学到什么? token的组成 token串的生成流程. token在客户端与服务器端的交互流程 Token的优点和思考 参考代码:核心代码使用参考,不是全部代码 JWT token的组成 头部 ...

  7. 13 令牌颁发方式 之 刷新令牌

    Refresh Token(刷新令牌) 上一篇 授权码模式 就说了,在授权码模式颁发令牌时,当发现该客户端支持 REFRESH_TOKEN 模式时,还会返回刷新令牌. 客户端可以使用刷新令牌(refr ...

  8. 关于OAuth 协议中刷新令牌存活时间的讨论

    OAuth 2.0 协议里,刷新令牌用于在当前访问令牌到期时获取新的访问令牌. 有关更多信息,请参阅 OAuth 2.0 RFC. 以 LinkedIn 提供的 API 为例. LinkedIn 提供 ...

  9. android fragment finish activity,如何从fragment跳到activity再从activity返回(finish()方法返回)刷新fragemnt页面...

    代码改变世界 如何从fragment跳到activity再从activity返回(finish()方法返回)刷新fragemnt页面 广播方法实现Fragment页面刷新 fragment中重写onA ...

最新文章

  1. 4、kubernetes资源清单快速入门190625
  2. 《机器学习与R语言(原书第2版)》一2.3 探索和理解数据
  3. 树莓派设置NTP同步
  4. 全局变量-global关键字修改全局变量
  5. html代码里面换图片不显示不出来了,微擎 Ueditor 百度编辑器 替换图片不显示问题...
  6. 10 CO配置-控制-成本中心会计-定义成本中心类别
  7. shell 执行脚本
  8. 或许你不知道的10条SQL技巧
  9. 559. N叉树的最大深度
  10. pc客户端软件自动化测试工具,PC客户端自动化测试工具--pywinauto
  11. KEIL5芯片包器件库的下载
  12. OverFeat(译)
  13. 三种方法求解Fibonacci(斐波那契)数列
  14. ReThought (二): 如何照顾团队中的新人
  15. [DEV] 陷阱技术探秘 ──动态汉化Windows技术的分析
  16. .net5 开启Lucene的全文搜索之旅
  17. 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
  18. java制作安卓游戏脚本_autoA开源(用java写安卓无障碍脚本)
  19. 工具 | Charles对Chrome浏览器抓包
  20. 标梵互动讲解怎样深度进入学习web前端开发

热门文章

  1. 网站-织梦-以及看不到织梦安装界面-织梦安装界面空白-织梦后台安装完成前台崩溃了
  2. 2022年辐射加热器元件市场前景分析及研究报告
  3. JSSDK 使用教程
  4. “智慧农业”农业用水综合管理平台,推动农业发展
  5. 实战爬取国庆期间各景点数据。数据来源去哪儿网
  6. 地质学计算机应用,1-计算机在地质学中的应用现状和发展趋势.ppt
  7. linux写iso文件到u盘,怎么把ISO写入U盘
  8. 智能车入门——车模器件篇 <新手从零做车>
  9. 关于股权,写给技术人的合伙攻略
  10. 微信小程序语言与web开发语言的区别