前端开发
Astro 项目用 Clerk 做鉴权时:配置…
在 Astro + Clerk 项目中,按 SSR、静态预渲染和 island 组件等不同渲染模式正确接入鉴权,并排查常见鉴权失效问题。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
Astro 项目用 Clerk 做鉴权时特定
解决思路
- 确认依赖版本:使用 `@clerk/astro` v3+,并要求 Astro 4.15+。
- 按任务查阅对应参考:配置 middleware 看 `references/middleware.md`;保护 SSR 页面看 `references/ssr-pages.md`;在 island 组件中使用 Clerk 看 `references/island-components.md`;API route 鉴权看 `references/api-routes.md`;在 Astro 中使用 Clerk 与 React 看 `references/astro-react.md`。
- 理解渲染模式对应做法:SSR 页面用 `Astro.locals.auth()`,由 middleware 填充;静态页面(`export const prerender = true`)会被 Clerk middleware 跳过,改用 islands 中的客户端 hooks;React/Vue/Svelte islands 使用 `@clerk/astro/react` 的 `useAuth()` 等 hooks。
- 配置 `astro.config.mjs`:从 `astro/config` 导入 `defineConfig`,从 `@clerk/astro` 导入 `clerk`,并导出 `defineConfig({ integrations: [clerk()], output: 'server' })`。
- 配置 `src/middleware.ts`:从 `@clerk/astro/server` 导入 `clerkMiddleware`、`createRouteMatcher`;用 `createRouteMatcher(['/dashboard(.*)'])` 创建 `isProtectedRoute`;导出 `onRequest = clerkMiddleware((auth, context, next) => { if (isProtectedRoute(context.request) && !auth().userId) { return auth().redirectToSignIn() } return next() })`。
- 在 SSR 页面中鉴权:在 Astro frontmatter 中写 `const { userId, orgId } = Astro.locals.auth()`,若 `!userId` 则 `return Astro.redirect('/sign-in')`。
- 修复 `Astro.locals.auth` 为 undefined:原因是缺少 middleware;把 `clerkMiddleware` 加到 `src/middleware.ts`。
- 修复开发环境鉴权正常但生产环境不正常:原因是全局 `output: 'static'`;为受保护页面设置 `output: 'server'` 或 `hybrid`。
- 修复静态页面没有鉴权:原因是预渲染页面会跳过 middleware;使用 `export const prerender = false`,或把鉴权移到 island。
- 修复 island 不响应登录状态:原因是缺少 `client:load` 指令;给 island 组件添加 `client:load`。
- 按导入映射正确导入:`clerkMiddleware`、`createRouteMatcher` 从 `@clerk/astro/server` 导入;`useAuth`、`useUser`、`UserButton` 从 `@clerk/astro/react` 导入;Astro 组件(如 `<SignIn>` 等)从 `@clerk/astro/components` 导入。
- 配置环境变量:在 `.env` 中设置 `PUBLIC_CLERK_PUBLISHABLE_KEY=pk_...` 和 `CLERK_SECRET_KEY=sk_...`;Astro 客户端暴露变量使用 `PUBLIC_` 前缀,不是 `NEXT_PUBLIC_`。
- 相关技能与文档:初始 Clerk 安装参考 `clerk-setup`;自定义流程与外观参考 `clerk-custom-ui`;B2B organizations 参考 `clerk-orgs`;官方文档见 Astro SDK 链接。
适用边界 · 注意事项
- 不使用 Astro 4.15+ 或 `@clerk/astro` v3+ 的项目不适用。
- 没有 Clerk 账号或不能使用第三方鉴权服务时不适用。
- 纯静态且预渲染的站点无法依赖 middleware 做 SSR 页面鉴权,需要改用 island/客户端 hooks。