Laravel sanctum 令牌身份验证在 model-binding 之后运行
Laravel sanctum token authentication runs after model-binding
TL;DR:
如果 bearer-token 请求命中带有 route-model-binding 但令牌不正确的端点,则响应应为 401
而不是 404
。它是 404
,因为模型在 之前解析 令牌被检查。
环境:
- Laravel 8
- Sanctum
- 承载 token-authentication API-requests;不涉及SPA。
- 使用隐式 route-model-binding
我的问题:
例如使用这个 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,
];
这样,在处理任何其他内容之前始终会检查身份验证。
希望,这会对某人有所帮助。
TL;DR:
如果 bearer-token 请求命中带有 route-model-binding 但令牌不正确的端点,则响应应为 401
而不是 404
。它是 404
,因为模型在 之前解析 令牌被检查。
环境:
- Laravel 8
- Sanctum
- 承载 token-authentication API-requests;不涉及SPA。
- 使用隐式 route-model-binding
我的问题:
例如使用这个 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,
];
这样,在处理任何其他内容之前始终会检查身份验证。
希望,这会对某人有所帮助。