You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中使用Passport重置密码后未自动吊销Access Token问题

回答:重置密码后需要手动吊销Passport Access Token

你猜的没错——Laravel默认的密码重置流程并不会自动吊销用户关联的所有Passport Access Token,这就是为什么你看不到自动生效的原因。

为什么默认不处理?

Laravel的核心密码重置逻辑(resetPassword方法)只负责更新用户的密码字段,并不会和Passport的令牌系统产生关联。Passport的Access Token是独立存储在oauth_access_tokens表中的,默认情况下没有机制会在密码变更时自动清理这些令牌。

你的手动实现是可行的,但可以优化

你提供的手动删除令牌的代码是有效的,但有个小问题:你通过邮箱重新查询了一次用户,其实在重置回调里已经有了$user实例,完全可以直接使用:

$response = $this->broker()->reset(
    $this->credentials($request),
    function ($user, $password) {
        $this->resetPassword($user, $password);
        // 直接用回调中的$user,避免重复查询数据库
        $user->tokens()->delete();
    }
);

更优雅的实现:使用事件监听

如果想让代码更符合单一职责原则,推荐用Laravel的事件系统来处理:

  1. 生成一个事件监听器:
php artisan make:listener RevokePassportTokensOnPasswordReset
  1. 在生成的监听器app/Listeners/RevokePassportTokensOnPasswordReset.php中添加逻辑:
<?php

namespace App\Listeners;

use Illuminate\Auth\Events\PasswordReset;

class RevokePassportTokensOnPasswordReset
{
    /**
     * Create the event listener.
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     */
    public function handle(PasswordReset $event): void
    {
        // 吊销该用户的所有Passport令牌
        $event->user->tokens()->delete();
    }
}
  1. 在app/Providers/EventServiceProvider.php中注册事件与监听器:
protected $listen = [
    \Illuminate\Auth\Events\PasswordReset::class => [
        \App\Listeners\RevokePassportTokensOnPasswordReset::class,
    ],
];

这样一来,每次密码重置成功时,事件会自动触发监听器,完成令牌吊销,控制器里不用写额外逻辑,代码更整洁。

为什么要这么做?

从安全角度来说,这是非常必要的最佳实践:用户申请重置密码,往往是因为怀疑账号可能被盗、令牌泄露或者自己忘记了密码,此时吊销所有旧令牌可以强制用户重新登录获取新令牌,避免旧令牌被滥用。

内容的提问来源于stack exchange,提问作者Sachin Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:11