如何方便的修改 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'));
    }

    //...
}
//...

关于时间值的写法,请参考:

https://secure.php.net/manual/en/dateinter...

本作品采用《CC 协议》,转载必须注明作者和本文链接
附言 1  ·  5年前

新版已经支持自定义 Personal Access Token 过期时间啦: https://github.com/laravel/passport/commit/41e2c43f5d6e860a08ca673df7b470826068b4ad

本帖由系统于 5年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 27

ajax 携带 AccessToken 请求的时候(中间件 auth:api),每次请求都会查好多次数据库。有没有简单点的办法加个redis,重写TokenGrant又不是很科学,量太大。

5年前 评论

@waney 有没有 SQL 列表贴一下

5年前 评论

每请求一次接口:

[2018-10-29 10:30:25] local.INFO: select * from `oauth_access_tokens` where `id` = 7a81a59200f6e0a74813d757c3ed80236de06841c8ed76840312abe3e8e1f**** limit 1  
[2018-10-29 10:30:25] local.INFO: select * from `sys_users` where `id` = 1 limit 1  
[2018-10-29 10:30:25] local.INFO: select * from `oauth_access_tokens` where `id` = 7a81a59200f6e0a74813d757c3ed80236de06841c8ed76840312abe3e8e1f**** limit 1  
[2018-10-29 10:30:25] local.INFO: select * from `oauth_clients` where `id` = 1 limit 1

@overtrue 问答:Passport OAuth_access_tokens 表查询两次,如何将验证 token 这个步...

5年前 评论
Explorer 4年前
waney (作者) 4年前
waney (作者) 4年前
Explorer 4年前

@waney 这。。。果然呢,提 PR 去

5年前 评论
waney 4年前

@overtrue 一年前就发现这个bug了 感觉这个passport可优化的空间 还很大!!! 另外还有一个严重问题 大家没发现么? 如果app要一直登录状态 但是token是有限时间的 那么应该什么时机自动刷新access token保持登录状态? 一个解决办法是过期之前就应提前刷新token 但是新问题是刷新时有并发请求 就会导致部分请求不成功甚至导致跳到重新登录界面!!! 这个也可以解决就是需要原来的token再刷新后还能短时间的保持有效状态 这个地方passport没有这样解决!!!

5年前 评论
waney 4年前

@fei0niao 使用 access_token 调用接口时,服务器返回过期提示时再用 refresh_token 进行刷新,这样能解决问题么

5年前 评论

@笛轻 不能解决 掉接口那次请求不是不成功了么? 必须更新token是用户无感知的! 并且要考虑过期时的并发请求问题!

5年前 评论

@overtrue 超哥去提个PR呗,貌似官方不怎么关心这问题啊,任何带有token的请求都会查两遍数据库。
相关issues 见 https://github.com/laravel/passport/issues... https://github.com/laravel/passport/issues...
还有一个稍微有点关联的 https://github.com/laravel/passport/issues...

5年前 评论

感谢,正好用到这个

5年前 评论

点赞 顺便关注讨论的BUG

5年前 评论

我看 passport 最新代码应该是可以自定义 personal access token 过期时间了:https://github.com/laravel/passport/blob/v...

5年前 评论

@overtrue 哈哈,超哥,你应该当时发个 PR 的。

5年前 评论

@overtrue 那新版的方法怎么使用呢?麻烦举个栗子吧!:)

5年前 评论

自己弄出来了:

app/Provides/AuthServiceProvider.php

.
.
.
    public function boot()
    {
        $this->registerPolicies();

        // 设置 PersonalAccessToken 有效期
        Passport::personalAccessTokensExpireIn(now()->addMonth(3));
    }
}
5年前 评论

@lx1036 害怕作者无情的拒绝

5年前 评论

@overtrue 避免每次查数据库的办法有吗 哈哈哈哈

5年前 评论
medz

@waney 不想太多查询数据库可以使用 JWT,日常情况我用 JWT ,反正也没用什么单设备登录或者登录设备限制之类的需求。

5年前 评论

@waney 还没去仔细研究这事儿,等我抽空看看

5年前 评论
北冥

@overtrue 我怎么判断我的token过期了,我把 oauth_access_tokens 表的 expires_at 字段时间改到现在之前,接口还是可以获取到数据
我只找到了判断token错误的是

if (! $request->expectsJson()) {
    return route('login');
}

laravel passport是通过别的什么判断token失效的吗

4年前 评论

tokensExpireIn()和personalAccessTokensExpireIn()设置过期时间区别是啥?
tokensExpirei是设置oauth_access_tokens表中的token过期时间,也就是用户token的过期时间;
personalAccessTokensExpireIn是设置oauth_personal_access_clients表中的过期时间,但这个过期时间是干嘛的?

4年前 评论
circle

Passport OAuth_access_tokens 表查询两次,如何将验证 token 这个步骤加入 Redis?有人实践过吗?

@waney 可以尝试一下这个,在 token 查询的方法中加了一层缓存 github.com/laravel/passport/pull/1...

3年前 评论

确实是个大问题!希望能得到官方的解决!

3年前 评论

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