token 第二次过期就不能再刷新了。

1. 运行环境

Windows 10 apache2 + php

1). 当前使用的 Laravel 版本?

Laravel Framework 9.33.0

2). 当前使用的 php/php-fpm 版本?

PHP 版本:

PHP 8.1.16

php-fpm 版本:

3). 当前系统

Windows 10

4). 业务环境

5). 相关软件版本

2. 问题描述?

jwt-auth 包是:”php-open-source-saver/jwt-auth”: “^2.1”

配置
JWT_SECRET=UjopxiS6mzw4Wy2RkVucteIR4pCK2DKhSgqm78CbJWYnmg1Mwrm5lBoHcFfOU1T8
JWT_TTL=1
JWT_REFRESH_TTL=2
JWT_SHOW_BLACKLIST_EXCEPTION=true

现在的情况是我通过用户名密码获取了 token1,token1 一分钟过期了,我用过 token1 可以刷新一个新的 token2 使用,但是当 token2 一分钟后过期了,我用 token2 想再刷新一个新的 token3 的时候报错了:Token has expired and can no longer be refreshed。按道理是在两分钟内是可以刷新新的 token 的。JWT_REFRESH_TTL=2 这个设置是我理解错了还是包有问题。

3. 您期望得到的结果?

可以刷新 token

4. 您实际得到的结果?

token 第二次过期就不能再刷新了。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

感谢大家,用 ChatGPT 翻译了一下这个配置的说明:

JWT_REFRESH_TTL的这个解释是这样的:
/*
|--------------------------------------------------------------------------
| 刷新令牌的生存时间
|--------------------------------------------------------------------------
|
| 指定在令牌生成后的一段时间内(以分钟为单位),令牌可以被刷新。
| 例如,用户可以在令牌生成后的2周窗口内刷新其令牌,直到他们必须重新进行身份验证。
| 默认为2周。
|
| 您还可以将其设置为null,以获得无限的刷新时间。
| 有些人可能希望在移动应用程序中使用这种代替永不过期的令牌。
| 尽管不太推荐这样做,但请确保如果需要的话,您有适当的系统来撤销令牌。
|
*/

我按照翻译理解,他这个刷新时间只能是每次登录时重置,这样能尽量保正 token 的安全,不然只要获取到一次 token 就可以无限刷新新的 token 了,事实上他也确实告诉了我们只要配置 null 就可以无限刷新新的 token 了,但是他说不推荐,但确保如果需要的这么做的话,最好适当的做一些操作来可以撤销令牌(我能想到的是后台记录用户最后操作时间,判断这个用户多久没活动了,然后强制他的所有 token 失效)。

8个月前 评论
讨论数量: 10

这个是包的问题 它没有重新赋值生效时间 你目前可以这样写

JWTAuth::parseToken()->refresh();

 //使用一次性登录以保证此次请求的成功
 Auth::onceUsingId(JWTAuth::manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);

$token = Auth::login(Auth::user());
8个月前 评论
徵羽宫 8个月前
cccdz (作者) 8个月前
cccdz (作者) 8个月前

确实, 我也遇到过这个问题, 他只是返回了新 token , 但没有重置有效期。

8个月前 评论

一般不是生成两个token吗,一个是access_token,一个是refresh_token,access_token过期了,只要refresh_token没过期就可以去刷新,看你的描述是两种token混一起?我也没使用过这个包,不知道说的对不对

8个月前 评论
mayingbiao89 (楼主) 8个月前

感谢大家,用 ChatGPT 翻译了一下这个配置的说明:

JWT_REFRESH_TTL的这个解释是这样的:
/*
|--------------------------------------------------------------------------
| 刷新令牌的生存时间
|--------------------------------------------------------------------------
|
| 指定在令牌生成后的一段时间内(以分钟为单位),令牌可以被刷新。
| 例如,用户可以在令牌生成后的2周窗口内刷新其令牌,直到他们必须重新进行身份验证。
| 默认为2周。
|
| 您还可以将其设置为null,以获得无限的刷新时间。
| 有些人可能希望在移动应用程序中使用这种代替永不过期的令牌。
| 尽管不太推荐这样做,但请确保如果需要的话,您有适当的系统来撤销令牌。
|
*/

我按照翻译理解,他这个刷新时间只能是每次登录时重置,这样能尽量保正 token 的安全,不然只要获取到一次 token 就可以无限刷新新的 token 了,事实上他也确实告诉了我们只要配置 null 就可以无限刷新新的 token 了,但是他说不推荐,但确保如果需要的这么做的话,最好适当的做一些操作来可以撤销令牌(我能想到的是后台记录用户最后操作时间,判断这个用户多久没活动了,然后强制他的所有 token 失效)。

8个月前 评论

不用过期,每次获取把历史的删除就好了

8个月前 评论
mayingbiao89 (楼主) 8个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!