如何方便的修改 Laravel Passport Personal Access Token 的过期时间
新版 Passport 已经支持修改过期时间了:https://github.com/laravel/passport/commit...
认真看过 Laravel Passport 文档 的人应该知道,它的 Personal Access Token 是不支持自定义过期时间的,tokensExpireIn
对此类 token 无效,原文如下:
Personal access tokens are always long-lived. Their lifetime is not modified when using the tokensExpireIn or refreshTokensExpireIn methods.
默认时间为 1 年,但是这可能不满足我们的需求,我们想要改成其它更短的时间怎么办呢?今天尝试了一下,应该算是全网可以找到的最简单方法了,直接在 app/Providers/AppServiceProvider
中添加一句就可以搞定,下面以改为有效期为 1 周的示例来演示:
app/Providers/AppServiceProvider.php
<?php
//...
use Laravel\Passport\Bridge\PersonalAccessGrant;
use League\OAuth2\Server\AuthorizationServer;
//...
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot()
{
$this->app->get(AuthorizationServer::class)
->enableGrantType(new PersonalAccessGrant(), new \DateInterval('P1W'));
}
//...
}
//...
关于时间值的写法,请参考:
本作品采用《CC 协议》,转载必须注明作者和本文链接
新版已经支持自定义 Personal Access Token 过期时间啦: https://github.com/laravel/passport/commit/41e2c43f5d6e860a08ca673df7b470826068b4ad
ajax 携带 AccessToken 请求的时候(中间件 auth:api),每次请求都会查好多次数据库。有没有简单点的办法加个redis,重写TokenGrant又不是很科学,量太大。
@waney 有没有 SQL 列表贴一下
每请求一次接口:
@overtrue 问答:Passport OAuth_access_tokens 表查询两次,如何将验证 token 这个步...
@waney 这。。。果然呢,提 PR 去
@overtrue 全靠你了
@overtrue 一年前就发现这个bug了 感觉这个passport可优化的空间 还很大!!! 另外还有一个严重问题 大家没发现么? 如果app要一直登录状态 但是token是有限时间的 那么应该什么时机自动刷新access token保持登录状态? 一个解决办法是过期之前就应提前刷新token 但是新问题是刷新时有并发请求 就会导致部分请求不成功甚至导致跳到重新登录界面!!! 这个也可以解决就是需要原来的token再刷新后还能短时间的保持有效状态 这个地方passport没有这样解决!!!
@fei0niao 使用 access_token 调用接口时,服务器返回过期提示时再用 refresh_token 进行刷新,这样能解决问题么
@笛轻 不能解决 掉接口那次请求不是不成功了么? 必须更新token是用户无感知的! 并且要考虑过期时的并发请求问题!
@overtrue 超哥去提个PR呗,貌似官方不怎么关心这问题啊,任何带有token的请求都会查两遍数据库。
相关issues 见 https://github.com/laravel/passport/issues... https://github.com/laravel/passport/issues...
还有一个稍微有点关联的 https://github.com/laravel/passport/issues...
感谢,正好用到这个
点赞 顺便关注讨论的BUG
厉害了, 我的锅!
我看 passport 最新代码应该是可以自定义 personal access token 过期时间了:https://github.com/laravel/passport/blob/v...
@lx1036 https://github.com/laravel/passport/commit... 哈哈我艹
@overtrue 哈哈,超哥,你应该当时发个 PR 的。
@overtrue 那新版的方法怎么使用呢?麻烦举个栗子吧!:)
自己弄出来了:
app/Provides/AuthServiceProvider.php
@lx1036 害怕作者无情的拒绝
@overtrue 避免每次查数据库的办法有吗 哈哈哈哈
@waney 不想太多查询数据库可以使用 JWT,日常情况我用 JWT ,反正也没用什么单设备登录或者登录设备限制之类的需求。
@medz 搞好了就不想改。
@waney 还没去仔细研究这事儿,等我抽空看看
赞一个,厉害
@overtrue 我怎么判断我的token过期了,我把
oauth_access_tokens
表的expires_a
t 字段时间改到现在之前,接口还是可以获取到数据我只找到了判断token错误的是
laravel passport是通过别的什么判断token失效的吗
tokensExpireIn()和personalAccessTokensExpireIn()设置过期时间区别是啥?
tokensExpirei是设置oauth_access_tokens表中的token过期时间,也就是用户token的过期时间;
personalAccessTokensExpireIn是设置oauth_personal_access_clients表中的过期时间,但这个过期时间是干嘛的?
@waney 可以尝试一下这个,在 token 查询的方法中加了一层缓存 github.com/laravel/passport/pull/1...
确实是个大问题!希望能得到官方的解决!