直接清空 oauth_access_tokens 表会出问题。会导致已登录用户突然401、刷新token失败、revoke逻辑失效及外键不一致,应使用php artisan passport:purge或$user->tokens->each->revoke()等安全清理方式。
直接清空 oauth_access_tokens 表会出问题吗
会。laravel passport 的 token 有生命周期、绑定用户和客户端,还可能被缓存或用于正在运行的请求。硬删表里所有记录会导致:已登录用户突然 401、刷新 token 失败、passport::token()->revoke() 等逻辑失效,甚至破坏 oauth_refresh_tokens 和 oauth_auth_codes 的外键一致性。
正确做法是走 Passport 提供的清理机制,而不是 TRUNCATE TABLE oauth_access_tokens。
用 php artisan passport:purge 清理过期 token
这是 Laravel Passport 内置命令,专为安全清理设计。它只删已过期、且未被标记为“可刷新”的 token(即 expires_at 且 <code>refresh_token_id IS NULL),同时联动清理关联的 oauth_refresh_tokens 和 oauth_auth_codes。
- 运行前确保数据库连接正常,否则命令静默失败
- 默认只清理过期 token;加
--force参数才会删所有(慎用) - 该命令不触发模型事件(如
deleting),所以依赖事件监听做日志或通知的逻辑不会执行 - 在生产环境建议先在测试库跑一遍,观察日志和表行数变化
示例:
php artisan passport:purge --force
手动 revoke 指定用户的全部 token
如果只想重置某用户(比如 ID=123)的授权状态,不要动全局表,而是调用模型方法逐个吊销:
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
-
$user->tokens()->delete()最直接,但跳过 Passport 的吊销逻辑(比如不更新oauth_refresh_tokens.revoked) - 推荐用
$user->tokens->each->revoke(),它会逐个调用Token::revoke(),保证 refresh token 同步失效 - 注意:此操作不影响该用户已发放的 client credentials token(它们不属于用户 scope)
- 若用户有大量 token,建议加
chunkById()避免内存溢出:$user->tokens()->chunkById(100, fn ($tokens) => $tokens->each->revoke());
开发环境快速重置:重装 Passport 数据库表
仅限本地或 CI 测试环境。如果你要彻底回到初始状态(比如调试 token 生成流程),比清数据更干净的做法是重建整个 Passport 迁移:
- 先运行
php artisan migrate:rollback --step=1回退最后一批迁移(含 Passport 的) - 再执行
php artisan migrate重跑 - 别忘了重新运行
php artisan passport:install生成新的加密密钥和 client - 注意:这会丢失所有 client、token、密钥,生产环境绝对禁止
这个流程真正“重置”了授权体系,不是清数据,而是重建信任链起点。
最常被忽略的是 refresh token 的状态同步——哪怕你删了 access token,只要对应的 refresh token 还在且没被标记 revoked=1,前端仍可能用它换新 token。所以清理必须成对处理,不能只盯 oauth_access_tokens 这一张表。










