如何方便的修改 Laravel Passport Personal Access Token 的过期时间

新版 Passport 已经支持修改过期时间了:https://github.com/laravel/passport/commit/41e2c43f5d6e860a08ca673df7b470826068b4ad

认真看过 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/dateinterval.construct.php

附言 1  ·  2个月前

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

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

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

4个月前
overtrue

@waney 有没有 SQL 列表贴一下

4个月前
waney

每请求一次接口:

[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 https://learnku.com/laravel/t/18967

4个月前
overtrue

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

4个月前
waney

@overtrue 全靠你了

4个月前

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

4个月前

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

4个月前

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

4个月前
winter-ice

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

4个月前
huzhuolei

感谢,正好用到这个

2个月前
vescape920

点赞 顺便关注讨论的BUG

2个月前

厉害了, 我的锅!

2个月前

我看 passport 最新代码应该是可以自定义 personal access token 过期时间了:https://github.com/laravel/passport/blob/v7.0.5/src/PassportServiceProvider.php#L113-L115

2个月前

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

2个月前
huzhuolei

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

2个月前
huzhuolei

自己弄出来了:

app/Provides/AuthServiceProvider.php

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

        // 设置 PersonalAccessToken 有效期
        Passport::personalAccessTokensExpireIn(now()->addMonth(3));
    }
}
2个月前
overtrue

@lx1036 害怕作者无情的拒绝

2个月前
waney

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

2个月前
medz

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

2个月前
waney

@medz 搞好了就不想改。

2个月前
overtrue

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

2个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!