Chrome ExtensionからSupabaseにアクセスするときのCORS設定方法(Astroで試しました)
/ 2 min read
Table of Contents
はじめに
Chrome ExtensionからSupabaseにアクセスするときのCORS設定方法をご紹介します。
なお、フロントエンドはAstroを使用しています。
方法
Chrome Extension
manifest.json
にhost_permissions
を記載し、fetch
する際にmode: "cors"
を使用します。
manifest.json
{ "manifest_version": 3, "host_permissions": [ "https://your-host.com/" ],}
backgrounjd.js
async function add({ postData }) { const apiEndpoint = "https://your-host.com/api/chrome-extension";
try { const res = await fetch(apiEndpoint, { method: "POST", mode: "cors", // COSモードでfetchする headers: { "Content-Type": "application/json", }, body: JSON.stringify({ postData }), }); if (!res.ok) throw new Error("Server Error"); return "OK"; } catch (error) { return "NG"; }}
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { if (request.action === "add") { add(request.data) .then(sendResponse) .catch((error) => sendResponse({ error: error.message })); return true; // この関数の応答が非同期であることを示す }});
Supabase
/_shared/cors.ts
どこでもいいので、_shared
というフォルダを作成し、その中にcors.ts
を作成します。
cors.ts
の中身は下記の通りです。chrome-extension://~
は、
Chrome > 拡張機能 > 拡張機能の管理
で、各拡張機能のIDで確認することができます。
export const corsHeaders = { "Access-Control-Allow-Origin": "chrome-extension://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Access-Control-Allow-Headers": "authorization, x-client-info, apikey, content-type", "Access-Control-Allow-Methods": "POST",};
/api/chrome-extension.ts
Chrome Extensionからアクセスされるエンドポイントです。
ここで、上記で作成したcorsHeaders
を使用します。
import type { APIRoute } from "astro";import { corsHeaders } from "../_shared/cors";import { supabase } from "../lib/supabase";
export const POST: APIRoute = async ({ request }) => { if (request.method === "OPTIONS") { return new Response("ok", { headers: corsHeaders }); }
const { data, error } = await supabase .from("examples") .insert({ title, url }) .select("id");
if (error) { return new Response(JSON.stringify({ error: error.message }), { headers: { ...corsHeaders, "Content-Type": "application/json" }, status: 500, }); }
return new Response(JSON.stringify(data), { headers: { ...corsHeaders, "Content-Type": "application/json" }, status: 200, });};
参考
CORS (Cross-Origin Resource Sharing) support for Invoking from the browser