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

Laravel Sanctum场景下如何校验请求中的Authorization Header

Laravel Sanctum 校验Authorization Header并返回提示方案

方案一:自定义中间件主动校验Header

这种方式可以精准控制校验逻辑,提前拦截缺失或格式错误的请求。

  1. 创建自定义中间件
    执行命令生成中间件文件:
php artisan make:middleware CheckAuthorizationHeader
  1. 编写校验逻辑
    打开生成的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);
    }
}
  1. 注册中间件
    在app/Http/Kernel.php的$routeMiddleware数组中添加注册:
protected $routeMiddleware = [
    // ... 其他已存在的中间件
    'check.auth.header' => \App\Http\Middleware\CheckAuthorizationHeader::class,
];
  1. 修改路由使用中间件
    把自定义中间件放在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:10:17