如何在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. 请求签名验证(高安全性方案)
如果需要更高的安全性,防止请求被伪造或重放,可以使用请求签名机制:
- 扩展端逻辑:
- 生成当前时间戳
timestamp - 将时间戳与请求参数的哈希值拼接,用密钥做HMAC-SHA256加密得到
signature - 将
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
相关产品推荐
相关产品推荐

