如何保护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 }); } }
配套配置说明
- 在Cloudflare Pages项目的「设置-环境变量」中,添加
SUPABASE_URL和SUPABASE_ANON_KEY两个变量,填入你的Supabase项目对应的值。 - 确保前端使用Supabase Auth SDK完成登录流程,SDK会自动在用户登录后设置
sb-access-tokenCookie。
内容的提问来源于stack exchange,提问作者Joao Gui
相关产品推荐
相关产品推荐

