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

如何在Laravel搭建的API服务器检测请求是否来自Chrome扩展?

识别Chrome扩展发起的Laravel API请求方案

以下是几种实用方案,帮你在Laravel API端验证请求是否来自你的Chrome扩展:

1. 自定义请求头验证

这是最简单直接的方案,适合大多数场景:

  • 在Chrome扩展的请求中添加一个自定义请求头,比如X-Extension-Key,值设置为你预先生成的唯一密钥(比如32位随机字符串)
  • 在Laravel中创建验证中间件:
    // 执行命令创建中间件:php artisan make:middleware VerifyExtensionRequest
    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    
    class VerifyExtensionRequest
    {
        public function handle(Request $request, Closure $next)
        {
            $validKey = env('EXTENSION_SECRET_KEY');
            // 验证请求头是否存在且匹配密钥
            if (!$request->hasHeader('X-Extension-Key') || $request->header('X-Extension-Key') !== $validKey) {
                return response()->json(['message' => 'Unauthorized'], 401);
            }
    
            return $next($request);
        }
    }
    
  • 在app/Http/Kernel.php中注册中间件,然后给需要保护的API路由添加该中间件即可。

2. 验证扩展Origin头(仅适用于已发布的扩展)

如果你的扩展已经发布到Chrome应用商店,它会有固定的ID,Chrome会自动在请求的Origin头中带上chrome-extension://[你的扩展ID]:

  • 在Laravel中间件中验证Origin头是否匹配你的扩展ID:
    public function handle(Request $request, Closure $next)
    {
        $allowedOrigin = 'chrome-extension://abcdefghijklmnopqrstuvwxyzabcdef'; // 替换为你的扩展ID
        if (!$request->hasHeader('Origin') || $request->header('Origin') !== $allowedOrigin) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }
    
        return $next($request);
    }
    
  • 注意:未打包发布的扩展ID每次编译都会变化,所以这个方案只适合正式发布的扩展。

3. 请求签名验证(高安全性方案)

如果需要更高的安全性,防止请求被伪造或重放,可以使用请求签名机制:

  • 扩展端逻辑:
    1. 生成当前时间戳timestamp
    2. 将时间戳与请求参数的哈希值拼接,用密钥做HMAC-SHA256加密得到signature
    3. 将timestamp和signature作为请求头(比如X-Request-Timestamp和X-Request-Signature)发送给API
  • Laravel端中间件验证逻辑:
    public function handle(Request $request, Closure $next)
    {
        $timestamp = $request->header('X-Request-Timestamp');
        $signature = $request->header('X-Request-Signature');
        $secret = env('EXTENSION_SECRET_KEY');
    
        // 验证请求是否过期(这里设置5分钟有效期)
        if (abs(time() - $timestamp) > 300) {
            return response()->json(['message' => 'Request expired'], 401);
        }
    
        // 生成对比签名
        $requestDataHash = hash('sha256', json_encode($request->all()));
        $validSignature = hash_hmac('sha256', $timestamp . $requestDataHash, $secret);
    
        if ($signature !== $validSignature) {
            return response()->json(['message' => 'Invalid signature'], 401);
        }
    
        return $next($request);
    }
    
  • 这个方案能有效防止请求被篡改和重放,安全性最高。

内容的提问来源于stack exchange,提问作者Siddhartha Choubey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:50:24