Laravel需借助Jetstream或Fortify启用TOTP双因素认证,必须运行迁移添加two_factor_secret等字段,Fortify需手动拦截登录检查2FA状态,Livewire中应调用getTwoFactorSecretQrCodeUrl而非decrypt,恢复码须先decrypt再json_decode。
直接上结论:Laravel 本身不内置完整双因素认证流程,但通过
trait + Jetstream 或 Fortify 可快速启用标准 TOTP(基于时间的一次性密码)方案;手动集成需补全密钥生成、验证逻辑和会话标记,否则登录后仍可绕过。
启用 TwoFactorAuthenticatable trait 后必须跑迁移
仅在
模型中 use
是不够的——数据库缺字段会导致后续所有操作失败,比如调用
时抛出
错误。
运行
在迁移文件中添加:
、
、
执行
,别跳过;Jetstream 安装时已自动包含该迁移,但 Breeze 或手写认证需自行补全
Fortify 中二因素认证默认不拦截登录请求
Fortify 的
只负责提供设置界面和密钥存储,它不会自动在登录成功后跳转到验证码页。你得自己加逻辑,否则用户输完账号密码就直接进去了,2FA 形同虚设。
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
在
的
数组里确认启用了
修改
,在
方法中注册自定义响应:
使用
包裹原始验证逻辑,并在返回前检查
若条件成立,返回重定向到
(Fortify 默认路由),而非直接返回
Livewire 组件里 decrypt($user->two_factor_secret) 会报错
Jetstream 的
模板里有类似
的写法,但
在 Livewire 组件上下文中可能因密钥未加载或 session 加密配置不一致而失败,表现为空白 QR 码或“DecryptException”。
不要在 Blade 模板或 Livewire
中直接调用
改用
(该方法内部已处理解密与 URL 编码)
或者在组件
中预先解密并赋值给 public 属性:
确保
未被轮换过;一旦轮换,旧的
就无法再解密,用户将永久无法扫码
最易被忽略的是恢复代码的加密存储方式——
字段内容是 JSON 数组经
处理后的字符串,不是明文。如果你用 DB::table() 直接查这个字段然后
,会得到乱码;必须先
再
,否则“Show Recovery Codes”按钮点开永远是空数组。
TwoFactorAuthenticatableUserTwoFactorAuthenticatable$user->enableTwoFactorAuthentication()SQLSTATE[42S22]: Column not foundphp artisan make:migration add_two_factor_columns_to_users_tablestring('two_factor_secret')->nullable()text('two_factor_recovery_codes')->nullable()timestamp('two_factor_confirmed_at')->nullable()php artisan migrateFeatures::twoFactorAuthentication()config/fortify.phpfeaturesFeatures::twoFactorAuthentication()app/Providers/FortifyServiceProvider.phpboot()Fortify::authenticateUsing()$user->two_factor_secret && !$request->session()->has('two-factor-authenticated')/two-factor-challenge$usertwo-factor-authentication-form.blade.php{{ decrypt($this->user->two_factor_secret) }}decrypt()render()decrypt()$user->getTwoFactorSecretQrCodeUrl()mount()$this->qrCodeUrl = $this->user->getTwoFactorSecretQrCodeUrl();APP_KEYtwo_factor_secrettwo_factor_recovery_codesencrypt()json_decode()decrypt()json_decode()