Laravel 9中忘记密码路由在Sanctum认证内失效问题求助
Laravel忘记密码路由无法在Sanctum中间件内工作的解决方法
核心原因:
auth:sanctum中间件用于验证已登录的API用户,而忘记密码功能面向未登录用户,请求时没有有效Sanctum令牌,会被中间件拦截返回401未授权。解决步骤:
- 调整路由位置:将忘记密码相关路由(发送重置链接、重置密码)移出
auth:sanctum路由组,放在无需认证的区域。示例代码:// 错误写法(在认证组内) Route::middleware('auth:sanctum')->group(function () { Route::post('/forgot-password', [PasswordResetController::class, 'sendResetLinkEmail']); }); // 正确写法1:放在认证组外 Route::post('/forgot-password', [PasswordResetController::class, 'sendResetLinkEmail']); // 正确写法2:在组内单独排除中间件 Route::middleware('auth:sanctum')->group(function () { // 其他需要认证的路由... }); Route::post('/forgot-password', [PasswordResetController::class, 'sendResetLinkEmail']) ->withoutMiddleware(['auth:sanctum']); - 检查控制器逻辑:确保忘记密码的控制器方法没有额外认证逻辑,比如不要调用
auth()->user()(此时用户未登录,会返回null)。Laravel自带的密码重置控制器已适配未认证场景。 - 验证路由中间件:执行
php artisan route:list命令,查看该路由实际应用的中间件,确认auth:sanctum未被加载。
- 调整路由位置:将忘记密码相关路由(发送重置链接、重置密码)移出
内容的提问来源于stack exchange,提问作者JB-Work
相关产品推荐
相关产品推荐

