You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:15:10