前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯10183
  • DeepInfer 开源,公开大规模推理部署能力
  • Cloudflare预览低价结构化抽取模型
  • Headroom 在本地压缩智能体上下文
  • 智能体改记忆,如何验证没有误伤
  • llama-server 工具控制与停止条件现兼容问题
  • 模型快十倍,智能体为何只快一点
  • 用决策模型做评测,先调分类阈值
  • 编码 Agent 实测:成本之外看交付细节
  • Mercury 3 发布:主打高速生成与百万上下文
  • 用 Node 拆解向量池化与检索质量
  • 补齐 Oracle 方言约束,轻量模型首答率跃升
  • 拆解 Claude Code 的完整智能体循环
  • 邮件 Agent 重试前先校验退信
  • 用信号队列约束 Agent 等待邮件
  • 用 Cloudflare 搭建 Agent 收信中枢
  • 一次字符串替换如何让线上文章翻倍
  • AI 搭项目失败,先确认代码是否拉取成功
  • 检索匹配再高,也救不了过期知识库
  • 本地模型帮你给常用命令起快捷名
  • MCP 无状态改版涉及哪些迁移工作
  • 检查 Supabase 服务端鉴权的信任来源
  • 流式 AI 接口延迟该如何拆分测量
  • 模型故障切换如何追踪实际调用路径
  • 百灵开放五款语音模型供开发者组合
  • Drex Max 为电脑操作智能体输出决策概率
  • 无人值守的 Claude 循环如何耗尽额度
  • Bedrock为Claude提供严格结构化输出
  • 错误码搜不准?给向量检索补上 BM25
  • 让 Agent 崩溃后续跑,并处理重复副作用
  • 用 TypeScript 搭建带人工审批的客服智能体
  • Copilot 模型策略支持 REST API 管理
  • Copilot多种使用场景启动模型弃用
  • 把框架说明随包交付,让编程智能体可用
  • Nx 恶意包如何借编程智能体窃取秘密
  • 用分层防护限制 Agent 越权与误操作
  • 在表格中用自然语言分析完整BigQuery数据
  • 亚马逊推 TorchNeuron,拓宽 PyTorch 芯片选择
  • OpenCode平台遭入侵,密钥被盗刷
  • Cloudflare如何将AI审查成本降68%
  • 将Copilot任务无缝接续到VS Code
  • Gemini 4 Argon 主打多 Agent 三维制作
  • 用关联 ID 串起 Agent 日志与异常
  • MiniMax新模型以半价提升编程表现
  • 用ADK消除语音代理调用工具时的冷场
  • 62行Bash拆解编程代理的运行机制
  • 从调用轨迹定位代理的延迟与费用问题
  • AI 迁移脚本删库:备份失败为何未阻断
  • DeepSeek 推出 Agent 搜索与网页抓取接口
  • Bedrock新增长视频结构化解析模型
  • 语音识别迁移 Trainium2 的优化实战
  • vLLM 推送式 KV 传输降低推理等待
  • 已加载 51 / 10183
8.0
热点
AI SCORE
技术实践2026-10-20 10:09

检查 Supabase 服务端鉴权的信任来源

dev.to · AI#身份认证#Supabase#Next.js
Editor brief · 编辑速览

文章提醒,Supabase 服务端代码不能直接信任 getSession() 从 Cookie 读取的用户信息来决定访问权限。文中建议使用会校验访问令牌签名的 getClaims(),并检查 AI 生成代码及旧教程是否沿用了不安全的鉴权写法。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

AI 使用声明:本文由我借助 AI 辅助撰写。我对照文末提到的 Supabase 和 Next.js 文档,核查了每一项论断和每一段代码示例。如果你发现错误,请在评论区告诉我,我会修正。

如果你让 AI Agent 为 Supabase + Next.js 应用编写身份验证代码,首先要检查一件事:服务端代码信任的是什么。

Agent(以及不少较早的教程)仍然会在 Server Components、Server Actions 和 route handlers 中生成这样的代码:

const { data: { session } } = await supabase.auth.getSession()
if (!session) redirect('/login')

const userId = session.user.id // used to decide what this request can read or write

这段代码看起来没问题,测试时也能正常运行。问题在于,这些数据来自哪里。

为什么不该在服务端用 getSession() 做验证

在服务端,getSession() 会从身份验证 cookie 中读取 session,但不会重新验证它。cookie 是用户输入。Supabase SSR 指南明确指出:任何人都可以伪造 session cookie,因此,绝不要在服务端代码中信任 getSession() 的结果。

如果 session.user.id 决定一次请求可以读写哪些行,那么伪造的 cookie 也就能决定这些权限。

用 getClaims() 保护页面和数据

getClaims() 会先验证 access token 的签名,再返回 claims:

对于使用非对称 JWT 签名密钥的项目(ECC 或 RSA,新项目默认采用这种方式),它会通过项目的 JWKS endpoint(/.well-known/jwks.json)验证签名。密钥通常会被缓存,因此验证速度很快。

对于仍使用对称密钥的项目,它会向 Auth server 发送请求来验证 token,与 getUser() 类似。

下面是一个受保护的 Server Component:

// app/dashboard/page.tsx
import { redirect } from 'next/navigation'
import { createClient } from '@/lib/supabase/server'

export default async function DashboardPage() {
  const supabase = await createClient()
  const { data, error } = await supabase.auth.getClaims()

  if (error || !data?.claims) redirect('/login')

  const userId = data.claims.sub // verified subject (the user's id)

  const { data: projects } = await supabase
    .from('projects')
    .select('id, name')
    .eq('owner_id', userId) // keep RLS on as well; this filter is not your only lock

  return <ProjectList projects={projects ?? []} />
}

什么时候该用哪个调用

Server Actions 是公开的 endpoint

即使 UI 中没有任何按钮调用某个 Server Action,它仍然可以通过 HTTP 被调用。要像对待 API route 一样对待每个 Server Action:验证输入、验证 claims,然后再写入数据。

免费规则包(可选)

如果你希望 Agent 不再生成旧的写法,免费的 Next.js + Supabase Loadout 规则包已经将这条要求设为固定规则。

标准修复说明页:Supabase SSR 中 getSession() 与 getClaims() 的区别。

Supabase SSR / 身份验证 cookie 指南(getSession 与经过验证的 claims)

Next.js App Router Server Components / Server Actions

如需进一步采取措施,你可以考虑屏蔽此人和/或举报滥用行为。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
MCP 无状态改版涉及哪些迁移工作
下一篇
流式 AI 接口延迟该如何拆分测量