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

认真看过 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

本帖由系统于 2周前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
waney

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

2周前
overtrue

@waney 有没有 SQL 列表贴一下

2周前
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://laravel-china.org/topics/18967

2周前
overtrue

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

2周前
waney

@overtrue 全靠你了

2周前

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

1周前

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

5天前

@笛轻 不能解决 掉接口那次请求不是不成功了么? 必须更新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

3天前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!