Laravel Fortify修改密码接口改用Sanctum认证仍提示未授权
问题分析与解决
你的问题核心是路由同时加载了auth:sanctum和auth:web两个认证中间件,导致认证逻辑冲突——auth:web会优先尝试Session认证,而你的API请求用的是Bearer Token,因此即使Token正确,也会因为Session认证失败返回Unauthenticated。
解决步骤
1. 修正Fortify中间件配置
打开config/fortify.php,确保middleware配置只保留API相关中间件:
'middleware' => ['api', 'auth:sanctum'],
同时检查配置文件中是否有其他单独针对密码路由的中间件设置,确保没有额外添加auth:web。
2. 自定义Fortify路由(可选,更精准控制)
如果全局修改配置无效,可以在App\Providers\FortifyServiceProvider的boot方法中,手动注册密码修改路由并指定中间件:
use Laravel\Fortify\Http\Controllers\PasswordController; use Illuminate\Support\Facades\Route; public function boot() { Fortify::ignoreRoutes(); // 禁用Fortify默认路由注册 // 手动注册密码修改路由 Route::put('/api/user/password', [PasswordController::class, 'update']) ->middleware(['api', 'auth:sanctum']) ->name('user-password.update'); }
3. 清除路由缓存
执行命令刷新路由缓存,确保修改生效:
php artisan route:clear
4. 验证请求细节
- 确认请求头包含
Authorization: Bearer {你的Sanctum Token} - 确保Token是通过Sanctum认证生成的(比如调用登录接口返回的有效Token)
- 如果是跨域请求,检查
config/sanctum.php的stateful数组是否包含你的前端域名,同时前端请求要携带withCredentials(如果需要)
5. 检查认证逻辑冲突
如果以上步骤无效,排查是否有全局中间件或路由组强制给API路由添加了auth:web中间件,比如routes/api.php中的路由组配置。
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

