Laravel Sanctum场景下如何校验请求中的Authorization Header
方案一:自定义中间件主动校验Header
这种方式可以精准控制校验逻辑,提前拦截缺失或格式错误的请求。
- 创建自定义中间件
执行命令生成中间件文件:
php artisan make:middleware CheckAuthorizationHeader
- 编写校验逻辑
打开生成的app/Http/Middleware/CheckAuthorizationHeader.php,替换内容为:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class CheckAuthorizationHeader { public function handle(Request $request, Closure $next): Response { // 检查Authorization头是否存在 if (!$request->header('Authorization')) { return response()->json([ 'message' => 'Authorization请求头缺失,请携带有效的Bearer Token' ], Response::HTTP_UNAUTHORIZED); } // 可选:校验Header格式是否为Bearer开头 $authHeader = $request->header('Authorization'); if (!str_starts_with($authHeader, 'Bearer ')) { return response()->json([ 'message' => 'Authorization格式错误,正确格式为Bearer {Token}' ], Response::HTTP_UNAUTHORIZED); } return $next($request); } }
- 注册中间件
在app/Http/Kernel.php的$routeMiddleware数组中添加注册:
protected $routeMiddleware = [ // ... 其他已存在的中间件 'check.auth.header' => \App\Http\Middleware\CheckAuthorizationHeader::class, ];
- 修改路由使用中间件
把自定义中间件放在auth:sanctum之前,确保先完成Header校验:
Route::prefix('v1')->group(function () { Route::prefix('auth')->group(function () { Route::middleware([ EnsureFrontendRequestsAreStateful::class, 'check.auth.header', 'auth:sanctum' ])->group(function () { Route::post('active-account', [AuthController::class, 'active_account']); }); }); });
方案二:通过异常处理器统一处理未认证场景
如果不需要额外的格式校验,仅需在未认证时返回友好提示,可以直接修改Laravel的异常处理逻辑:
打开app/Exceptions/Handler.php,添加或修改unauthenticated方法(Laravel 9+可使用renderable闭包):
<?php namespace App\Exceptions; use Illuminate\Auth\AuthenticationException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Throwable; class Handler extends ExceptionHandler { // ... 其他原有代码 // Laravel 8及以下版本使用此方法 protected function unauthenticated($request, AuthenticationException $exception) { if ($request->is('api/*')) { return response()->json([ 'message' => 'Authorization请求头缺失或Token无效' ], 401); } return parent::unauthenticated($request, $exception); } // Laravel 9+版本可在register方法中添加以下逻辑 // public function register() // { // $this->renderable(function (AuthenticationException $e, $request) { // if ($request->is('api/*')) { // return response()->json(['message' => 'Authorization请求头缺失或Token无效'], 401); // } // }); // } }
注意事项
- 若你的API面向第三方客户端而非SPA,可考虑移除
EnsureFrontendRequestsAreStateful::class,避免该中间件的Cookie认证逻辑干扰Header校验。 - 测试时确保请求未携带认证Cookie,避免自动跳过Header校验流程。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

