Laravel sanctum 令牌身份验证在 model-binding 之后运行

Laravel sanctum token authentication runs after model-binding

TL;DR:
如果 bearer-token 请求命中带有 route-model-binding 但令牌不正确的端点,则响应应为 401 而不是 404。它是 404,因为模型在 之前解析 令牌被检查。

环境:

我的问题:
例如使用这个 api-route:

//routes/api.php
Route::middleware('auth:sanctum')->group(function () {
    Route::get('surveys/{survey:uuid}', [SurveyController::class, 'getSurveyDetails']);
});

当使用不正确的持有者令牌和不存在的 survey-uuid 请求此路由时,它不会 return 401 未验证但 404 因为它不能找到请求的模型。

对我来说这似乎是一个 security-issue 因为没有经过身份验证的请求可以证明 ID 是否存在。

我试过的:
如此处所述:https://github.com/laravel/framework/issues/6118
\Illuminate\Routing\Middleware\SubstituteBindings- 中间件负责解析 route-model-bindings.
但尚不完全清楚它是否应该 运行 在任何 authentication/authorization 操作之前或之后。

此外,根据 sactum-package-code \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful-中间件应该负责验证 bearer-token.

据我了解,它也将其设置为中间件优先级列表的顶部。

//Laravel/Sanctum/src/SanctumServiceProvider
protected function configureMiddleware()
    {
        $kernel = $this->app->make(Kernel::class);

        $kernel->prependToMiddlewarePriority(EnsureFrontendRequestsAreStateful::class);
    }

据此,我也厌倦了在 Http/Kernel.php 内配置我的优先级列表以确保此行为:

//App/Http/Kernel.php
protected $middlewarePriority = [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ];

不幸的是,它保持 returning 404 而不是 401。 检查令牌应该在模型解析之前完成。

有什么想法吗?
感谢您的任何提示。

致遇到类似问题的任何人: 解决方案是将 \App\Http\Middleware\Authenticate::class 中间件添加到 $middlewarePriority 数组 的最顶端 .

这样做,数组应该如下所示:

//App/Http/Kernel.php
protected $middlewarePriority = [
    \App\Http\Middleware\Authenticate::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
];

这样,在处理任何其他内容之前始终会检查身份验证。

希望,这会对某人有所帮助。