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

Laravel 11中哈希存储的密码重置令牌如何验证并获取用户信息

在Laravel 11中通过哈希密码重置令牌获取用户邮箱

Laravel的密码重置令牌是哈希后存在password_reset_tokens表的,没法直接用明文令牌匹配查询,下面是两种可行的解决方法:

方法一:用Laravel内置密码重置Broker(推荐)

Laravel自带的Password门面已经封装了验证令牌并获取用户的逻辑,直接调用即可:

use Illuminate\Support\Facades\Password;

// 你拿到的明文重置令牌
$plainToken = '7f13dbb4f7401fb0601a9ef3e53607e69e0bc511c51db66b6ec88e2719964e75';

// 获取默认的密码重置broker(对应users表)
$broker = Password::broker();

// 验证令牌并返回对应User模型
$user = $broker->getUserByToken($plainToken);

if ($user) {
    // 拿到用户邮箱
    $userEmail = $user->email;
    // 后续业务逻辑处理
}

这个方法的优势是完全复用Laravel内置的验证逻辑,还会自动处理令牌过期的判断(默认令牌有效期1小时),不用自己写额外的过期校验。

方法二:手动查询验证哈希匹配

如果不想用门面,也可以直接操作数据库表,通过Hash门面验证令牌哈希:

use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
use App\Models\User;

$plainToken = '7f13dbb4f7401fb0601a9ef3e53607e69e0bc511c51db66b6ec88e2719964e75';

// 查询所有未过期的重置记录(可选,先过滤过期的提升效率)
$resetRecords = DB::table('password_reset_tokens')
    ->where('created_at', '>=', now()->subHour())
    ->get();

// 遍历验证每个记录的令牌哈希
foreach ($resetRecords as $record) {
    if (Hash::check($plainToken, $record->token)) {
        $userEmail = $record->email;
        // 也可以直接获取User模型
        $user = User::where('email', $record->email)->first();
        break;
    }
}

注意:这种方法需要自己处理令牌过期逻辑,而且如果重置记录较多,遍历的效率会比第一种方法低,所以优先推荐用内置Broker的方式。

另外补充:在你重写的sendPasswordResetNotification方法里,当前上下文已经是User实例,直接用$this->email就能拿到用户邮箱,不需要通过令牌查询。这个方法主要适用于其他场景(比如密码重置页面接收令牌参数时,需要获取对应用户信息)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:45:01