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
相关产品推荐
相关产品推荐

