全新Laravel Sanctum API异常重定向至/dashboard路由问题排查
解决Laravel Sanctum API注册/登录后重定向到dashboard的问题
这不是Sanctum的Bug,是Laravel默认的认证控制器(比如RegisterController、LoginController)继承的AuthenticatesUsers、RegistersUsers trait中,默认配置了登录/注册成功后的Web端重定向路径,而你的纯API场景不需要这套逻辑。
修复方案
1. 自定义认证控制器的响应逻辑
如果你用了Laravel自带的Auth脚手架生成的控制器,直接修改app/Http/Controllers/Auth下的对应文件,替换默认的重定向行为:
注册控制器(RegisterController):
重写create方法,直接返回JSON响应:protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); // 返回API格式的注册成功响应 return response()->json([ 'message' => '注册成功', 'user' => $user, 'token' => $user->createToken('API Token')->plainTextToken ], 201); }登录控制器(LoginController):
重写authenticated方法,返回JSON响应:protected function authenticated(Request $request, $user) { return response()->json([ 'message' => '登录成功', 'user' => $user, 'token' => $user->createToken('API Token')->plainTextToken ]); }
2. 调整RouteServiceProvider的默认配置
在app/Providers/RouteServiceProvider.php中,默认的HOME常量被设为/dashboard,这是Web端的重定向目标。可以修改它适配API场景,或者保持原样(只要控制器不依赖这个常量即可):
// 原代码 public const HOME = '/dashboard'; // 修改为API路径示例 public const HOME = '/api/user';
3. 编写纯API专用的认证逻辑(更推荐)
如果是纯API项目,建议放弃Web Auth脚手架,手动编写API路由和控制器:
在routes/api.php中定义路由:
use App\Http\Controllers\Auth\ApiAuthController; Route::post('/register', [ApiAuthController::class, 'register']); Route::post('/login', [ApiAuthController::class, 'login']);
创建ApiAuthController,完全自定义认证逻辑:
namespace App\Http\Controllers\Auth; use App\Models\User; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Auth; class ApiAuthController extends Controller { public function register(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', ]); $user = User::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => Hash::make($validated['password']), ]); return response()->json([ 'message' => '注册成功', 'user' => $user, 'token' => $user->createToken('API Token')->plainTextToken ], 201); } public function login(Request $request) { $validated = $request->validate([ 'email' => 'required|string|email', 'password' => 'required|string', ]); if (!Auth::attempt($validated)) { return response()->json([ 'message' => '邮箱或密码错误' ], 401); } $user = User::where('email', $validated['email'])->firstOrFail(); return response()->json([ 'message' => '登录成功', 'user' => $user, 'token' => $user->createToken('API Token')->plainTextToken ]); } }
这样就完全脱离Web端的重定向逻辑,适配纯API场景。
内容的提问来源于stack exchange,提问作者Hamid Hosseini
相关产品推荐
相关产品推荐

