Laravel忘记密码功能提示无效Token 手动Hash::check验证正常如何解决
Laravel 密码重置提示无效Token的问题原因及解决方案
常见原因及对应解决方法:
- Token传递编码异常
你手动校验Hash::check验证通过说明原始Token和数据库哈希值匹配,但是实际请求传递的Token可能存在URL编码转义问题,比如邮件链接中的Token被自动urlencode,后端接收后未解码就直接传入校验逻辑,导致匹配失败。
解决方法:先打印输出$request->input('token')和邮件内的原始Token对比,确认是否一致。存在编码问题可先对Token做解码处理:
$credentials = $request->only('email', 'password', 'password_confirmation'); // 解码处理Token $credentials['token'] = urldecode($request->input('token')); $status = Password::reset( $credentials, function ($user, $password) { $user->forceFill([ 'password' => Hash::make($password), ])->save(); event(new PasswordReset($user)); } );
- 邮箱信息不匹配
Password::reset会同时校验password_resets表中对应邮箱和Token的关联关系,哪怕Token本身校验通过,只要传入的邮箱和生成Token时的邮箱不一致,也会返回无效Token提示,常见于邮箱大小写不匹配问题。
解决方法:发送重置链接和提交重置请求时统一处理邮箱大小写:
// 发送重置链接端统一邮箱转小写 $status = Password::sendResetLink( ['email' => strtolower($request->input('email'))] ); // 重置请求端统一邮箱转小写 $credentials = $request->only('password', 'password_confirmation', 'token'); $credentials['email'] = strtolower($request->input('email'));
Token已过期
Laravel默认密码重置Token有效期为60分钟,超过有效期Password::reset也会返回无效Token提示,如果你在config/auth.php中修改过passwords.users.expire参数设置过短也会触发该问题。
解决方法:检查config/auth.php中passwords配置项的expire参数,调整为符合业务需要的时长,测试时使用刚生成的重置链接验证。密码代理配置不匹配
如果你使用了非默认的用户认证守卫,比如后台管理员账号重置密码,Password门面默认调用users类型的密码代理,代理不匹配会导致校验失败。
解决方法:重置密码时指定对应的密码代理:
// 示例为管理员账号重置 $status = Password::broker('admins')->reset($credentials, function ($user, $password) { // 重置逻辑 });
内容的提问来源于stack exchange,提问作者Aslam-Ep
相关产品推荐
相关产品推荐

