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

如何保护Cloudflare Worker路由,仅允许已在Supabase认证的用户访问?

保护Cloudflare Pages Worker路由:仅允许Supabase认证用户访问

我正在使用Cloudflare Pages Function创建Worker,需要实现仅让通过Supabase身份认证的用户访问Worker路由的功能,以下是我写的代码示例:

import { createClient } from '@supabase/supabase-js'

export async function onRequest(context) {
   const token = context.request.headers.get('Cookie')
   const supabase = createClient(
      'url',
      'key')
   const {user, error} = await supabase.auth.getUser(token)
   if(user){
      return new Response("YES!")
   } else {
      return new Response("Access Denied")
   }
}

现有代码的问题与优化方案

  • Cookie提取错误:supabase.auth.getUser()需要的是单独的JWT token,而非整个Cookie Header。Supabase登录后会将token存在sb-access-token这个特定Cookie中,需要精准提取。
  • 硬编码敏感信息:Supabase的URL和密钥不能直接写在代码里,要改用Cloudflare Pages的环境变量管理。
  • 错误处理缺失:只判断user存在与否,没处理token无效、过期或请求失败的情况,也没返回正确的HTTP状态码。
  • 响应不规范:拒绝访问时应返回401 Unauthorized状态码,而非默认的200。

优化后的代码示例

import { createClient } from '@supabase/supabase-js'

export async function onRequest(context) {
  // 提取Supabase的access token Cookie
  const cookieHeader = context.request.headers.get('Cookie');
  let accessToken = null;
  if (cookieHeader) {
    const cookies = cookieHeader.split(';').map(c => c.trim());
    for (const cookie of cookies) {
      if (cookie.startsWith('sb-access-token=')) {
        accessToken = cookie.split('=')[1];
        break;
      }
    }
  }

  // 用环境变量初始化Supabase客户端
  const supabase = createClient(
    context.env.SUPABASE_URL,
    context.env.SUPABASE_ANON_KEY
  );

  if (!accessToken) {
    return new Response("Access Denied: No authentication token found", { status: 401 });
  }

  try {
    const { user, error } = await supabase.auth.getUser(accessToken);
    if (error) throw error;
    
    return user 
      ? new Response("Authenticated successfully", { status: 200 })
      : new Response("Access Denied: Invalid user", { status: 401 });
  } catch (err) {
    return new Response(`Access Denied: ${err.message}`, { status: 401 });
  }
}

配套配置说明

  1. 在Cloudflare Pages项目的「设置-环境变量」中,添加SUPABASE_URL和SUPABASE_ANON_KEY两个变量,填入你的Supabase项目对应的值。
  2. 确保前端使用Supabase Auth SDK完成登录流程,SDK会自动在用户登录后设置sb-access-token Cookie。

内容的提问来源于stack exchange,提问作者Joao Gui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:27:40