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

Laravel 9中如何5分钟后从会话中移除OTP验证码

基于OTP的身份验证:Session实现5分钟过期方案

完全可以用Session实现OTP的5分钟自动失效,不需要单独使用Cookie——Cookie存储在客户端,OTP作为敏感验证信息,存在服务端的Session里安全性更高,还能避免客户端篡改的风险。

你的现有代码只实现了OTP的存储,但没处理过期逻辑,下面是完善后的实现思路和代码:

1. 生成并存储带过期时间的OTP

在生成OTP时,同时存入Session的不仅有验证码,还有它的过期时间戳(当前时间+5分钟):

// 生成5位OTP验证码
$otp_code = random_int(10000, 99999);
// 计算过期时间:当前时间 + 5分钟(300秒)
$otp_expires_at = now()->addMinutes(5)->timestamp;

// 将OTP和过期时间存入Session
Session::put([
    'otp_code' => $otp_code,
    'otp_expires_at' => $otp_expires_at
]);

2. 验证OTP时检查有效性

当用户提交验证码时,先从Session取出值,验证两个条件:验证码匹配、未过期:

$submitted_otp = request()->input('otp_code');
$stored_otp = Session::get('otp_code');
$expires_at = Session::get('otp_expires_at');

// 验证逻辑
if ($stored_otp && $submitted_otp == $stored_otp && now()->timestamp <= $expires_at) {
    // OTP验证通过,执行后续逻辑(比如登录、绑定)
    // 验证通过后记得清除Session里的OTP信息
    Session::forget(['otp_code', 'otp_expires_at']);
} else {
    // OTP无效或已过期,返回错误提示
    return back()->withErrors(['otp' => '验证码无效或已过期']);
}

对原有代码的优化说明

你原来的代码里session()->get('otp_code');和session()->forget('otp_code');其实没必要提前执行,直接用Session::put会覆盖原有值,无需先清除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:25:23