Laravel 8 中配置 Fortify 无头认证需跳过 Blade 视图,仅启用路由与 API 控制器:安装后清配置缓存,配置 features 启用登录/注册等功能,禁用视图绑定返回 404,自定义 authenticateUsing 支持多字段登录,并确保使用 session 守卫及 JSON 响应格式。

要在 Laravel 8 中配置 Fortify 实现无头(headless)认证后端逻辑,必须跳过所有 Blade 视图依赖,仅启用路由、控制器与验证规则,并确保所有端点可被 API 客户端(如 Vue/React/Swift/Android)直接调用,否则 /login 等路径会返回 404 或视图缺失错误。
安装与基础初始化
执行 composer require laravel/fortify 安装包,然后运行 php artisan fortify:install。该命令会发布 config/fortify.php 和注册 FortifyServiceProvider,但不会生成任何路由或视图文件——这是无头设计的前提。
立即运行 php artisan config:clear,否则后续修改 features 将不生效,所有认证路由仍不可访问。
启用核心认证功能
打开 config/fortify.php,将 'features' 数组设为所需功能常量:
方法一:最小可用登录+注册
Features::login(), Features::registration()
方法二:含密码重置与邮箱验证(需提前配置 MAIL_MAILER)
Features::login(), Features::registration(), Features::resetPasswords(), Features::emailVerification()
注意:User 模型必须实现 MustVerifyEmail 接口才能启用 emailVerification 功能,否则启动时会抛出 RuntimeException。
保存后再次执行 php artisan config:clear,否则新配置被缓存,route:list 中看不到 /login、/register 等路由。
禁用视图绑定,强制走 API 流程
在 app/Providers/FortifyServiceProvider.php 的 boot() 方法中,添加以下三行:
Fortify::loginView(fn () => abort(404));
Fortify::registerView(fn () => abort(404));
Fortify::requestPasswordResetLinkView(fn () => abort(404));
这一步让所有试图访问 Blade 登录页的 GET 请求直接返回 404,明确告诉前端“本后端不提供 HTML 页面”,避免误配视图路径引发混淆。
同时移除或注释掉 Fortify::ignoreRoutes();(如果存在),确保 Fortify 路由正常注册。
自定义登录逻辑以支持多字段认证
第一步:在 FortifyServiceProvider@boot 中注册闭包
Fortify::authenticateUsing(function (Request $request) {
第二步:查询用户,兼容 email 或 phone 字段
$user = User::where('email', $request->login)
->orWhere('phone', $request->login)
->first();
第三步:校验密码并返回用户实例(返回 null 表示失败)
if ($user && Hash::check($request->password, $user->password)) {
return $user;
}
return null;
第四步:确保前端 POST 到 /login 时携带 login 字段而非固定 email,否则查询永远为空——这是最常踩的坑,字段名不匹配会导致静默失败且无错误提示。
配置认证守卫与响应格式
编辑 config/auth.php,确认 'guards.web.driver' 为 session,这是无头场景下 Cookie 认证的必需前提;若对接移动端,后续需配合 Sanctum 的 EnsureFrontendRequestsAreStateful 中间件。
在 app/Http/Controllers/Auth/AuthenticatedSessionController.php 中,将 store() 方法内的 return $request->wantsJson() 分支保留,确保 JSON 请求返回标准结构:{"user": {...}, "token": null}(session 场景 token 为 null)。
不要修改 store() 中的 Auth::guard('web')->login($user); 行——这是会话认证的核心,删掉就无法设置 session_id cookie。


















