如何为Laravel Fortify邮箱功能创建可用的$token
问题根因
你当前的实现存在3个核心问题导致token无法被Fortify校验通过:
- 生成的随机token没有存入Fortify用于校验的
password_resets表,Fortify校验令牌时会优先匹配表内的存储记录,不存在的token会直接被判定为非法 - 你没有对token做哈希加密处理,Laravel/Fortify存储在
password_resets表内的token是经过哈希运算后的值,明文token无法通过哈希匹配校验 - 你完全绕过了Fortify自带的令牌生成逻辑,令牌有效期、重复请求校验等默认规则全部未生效,也会导致校验失败
修复方案
直接调用Laravel密码系统自带的令牌生成方法即可,不需要手动生成随机字符串:
use Illuminate\Support\Facades\Password; public function store(UserCreateRequest $request): RedirectResponse { $user = User::create( array_merge( $request->validated(), ['password' => bcrypt(Str::random(8))] ) ); // 自动生成合法令牌、哈希后存入password_resets表、自带有效期校验 $token = Password::createToken($user); $user->sendPasswordCreateNotification($token); }
补充注意事项
- 如果你自定义了
sendPasswordCreateNotification通知类,邮件内的跳转链接需要和Fortify默认的密码重置路由规则一致,必须携带email和token两个参数,否则会出现路由/参数校验失败 - 令牌默认有效期可以在
config/fortify.php的defaults.passwords.expire配置项中调整,单位为分钟 - 确保你的User模型实现了
Illuminate\Contracts\Auth\CanResetPassword契约,否则令牌生成逻辑会报错
内容的提问来源于stack exchange,提问作者Aipo
相关产品推荐
相关产品推荐

