workos-authkit-tanstack-start
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseWorkOS AuthKit for TanStack Start
适用于TanStack Start的WorkOS AuthKit
Decision Tree
决策树
1. Fetch README (BLOCKING)
├── Extract package name from install command
└── README is source of truth for ALL code patterns
2. Detect directory structure
├── src/ (TanStack Start v1.132+, default)
└── app/ (legacy vinxi-based projects)
3. Follow README install/setup exactly
└── Do not invent commands or patterns1. 获取README(阻塞步骤)
├── 从安装命令中提取包名
└── README是所有代码模式的唯一可信来源
2. 检测目录结构
├── src/(TanStack Start v1.132+,默认结构)
└── app/(基于vinxi的旧版项目)
3. 严格遵循README中的安装/设置步骤
└── 请勿自行编写命令或模式Fetch SDK Documentation (BLOCKING)
获取SDK文档(阻塞步骤)
STOP - Do not proceed until complete.
WebFetch:
https://github.com/workos/authkit-tanstack-start/blob/main/README.mdFrom README, extract:
- Package name:
@workos/authkit-tanstack-react-start - Use that exact name for all imports
README overrides this skill if conflict.
停止操作 - 完成此步骤前请勿继续。
网络获取地址:
https://github.com/workos/authkit-tanstack-start/blob/main/README.md从README中提取:
- 包名:
@workos/authkit-tanstack-react-start - 所有导入语句必须使用此精确包名
若存在冲突,README内容优先级高于本技能文档。
Pre-Flight Checklist
预检查清单
- README fetched and package name extracted
- or
@tanstack/startin package.json@tanstack/react-start - Identify directory structure: (modern) or
src/(legacy)app/ - Environment variables set (see below)
- 已获取README并提取包名
- package.json中包含或
@tanstack/start@tanstack/react-start - 已识别目录结构:(现代版)或
src/(旧版)app/ - 已设置环境变量(见下文)
Directory Structure Detection
目录结构检测
Modern TanStack Start (v1.132+) uses :
src/src/
├── start.ts # Middleware config (CRITICAL)
├── router.tsx # Router setup
├── routes/
│ ├── __root.tsx # Root layout
│ ├── api.auth.callback.tsx # OAuth callback (flat route)
│ └── ...Legacy (vinxi-based) uses :
app/app/
├── start.ts or router.tsx
├── routes/
│ └── api/auth/callback.tsx # OAuth callback (nested route)Detection:
bash
ls src/routes 2>/dev/null && echo "Modern (src/)" || echo "Legacy (app/)"**现代版TanStack Start(v1.132+)**使用目录:
src/src/
├── start.ts # 中间件配置(关键文件)
├── router.tsx # 路由设置
├── routes/
│ ├── __root.tsx # 根布局
│ ├── api.auth.callback.tsx # OAuth回调(扁平路由)
│ └── ...**旧版(基于vinxi)**使用目录:
app/app/
├── start.ts 或 router.tsx
├── routes/
│ └── api/auth/callback.tsx # OAuth回调(嵌套路由)检测命令:
bash
ls src/routes 2>/dev/null && echo "Modern (src/)" || echo "Legacy (app/)"Environment Variables
环境变量
| Variable | Format | Required |
|---|---|---|
| | Yes |
| | Yes |
| Full URL | Yes |
| 32+ chars | Yes |
Generate password if missing:
openssl rand -base64 32Default redirect URI:
http://localhost:3000/api/auth/callback| 变量名 | 格式 | 是否必填 |
|---|---|---|
| | 是 |
| | 是 |
| 完整URL | 是 |
| 32字符以上 | 是 |
如果缺少密码,生成方式:
openssl rand -base64 32默认重定向URI:
http://localhost:3000/api/auth/callbackMiddleware Configuration (CRITICAL)
中间件配置(关键步骤)
authkitMiddleware MUST be configured or auth will fail silently.
Create or update (or for legacy):
src/start.tsapp/start.tstypescript
import { authkitMiddleware } from '@workos/authkit-tanstack-react-start';
export default {
requestMiddleware: [authkitMiddleware()],
};Alternative pattern with createStart:
typescript
import { createStart } from '@tanstack/react-start';
import { authkitMiddleware } from '@workos/authkit-tanstack-react-start';
export default createStart({
requestMiddleware: [authkitMiddleware()],
});必须配置authkitMiddleware,否则认证会静默失败。
创建或更新(旧版项目为):
src/start.tsapp/start.tstypescript
import { authkitMiddleware } from '@workos/authkit-tanstack-react-start';
export default {
requestMiddleware: [authkitMiddleware()],
};另一种使用createStart的写法:
typescript
import { createStart } from '@tanstack/react-start';
import { authkitMiddleware } from '@workos/authkit-tanstack-react-start';
export default createStart({
requestMiddleware: [authkitMiddleware()],
});Verification Checklist
验证清单
- imported from
authkitMiddleware@workos/authkit-tanstack-react-start - Middleware in array
requestMiddleware - File exports the config (default export or named )
startInstance
Verify:
grep -r "authkitMiddleware" src/ app/ 2>/dev/null- 已从导入
@workos/authkit-tanstack-react-startauthkitMiddleware - 中间件已加入数组
requestMiddleware - 文件已导出配置(默认导出或命名为)
startInstance
验证命令:
grep -r "authkitMiddleware" src/ app/ 2>/dev/nullCallback Route (CRITICAL)
回调路由(关键步骤)
Path must match . For :
WORKOS_REDIRECT_URI/api/auth/callbackModern (flat routes):
Legacy (nested routes):
src/routes/api.auth.callback.tsxapp/routes/api/auth/callback.tsxtypescript
import { createFileRoute } from '@tanstack/react-router';
import { handleCallbackRoute } from '@workos/authkit-tanstack-react-start';
export const Route = createFileRoute('/api/auth/callback')({
server: {
handlers: {
GET: handleCallbackRoute(),
},
},
});Key points:
- Use - do not write custom OAuth logic
handleCallbackRoute() - Route path string must match the URI path exactly
- This is a server-only route (no component needed)
路径必须与匹配。对于:
WORKOS_REDIRECT_URI/api/auth/callback现代版(扁平路由):
旧版(嵌套路由):
src/routes/api.auth.callback.tsxapp/routes/api/auth/callback.tsxtypescript
import { createFileRoute } from '@tanstack/react-router';
import { handleCallbackRoute } from '@workos/authkit-tanstack-react-start';
export const Route = createFileRoute('/api/auth/callback')({
server: {
handlers: {
GET: handleCallbackRoute(),
},
},
});关键点:
- 使用- 请勿编写自定义OAuth逻辑
handleCallbackRoute() - 中的路由路径字符串必须与URI路径完全匹配
createFileRoute() - 这是仅服务端路由(无需组件)
Protected Routes
受保护的路由
Use in route loaders to check authentication:
getAuth()typescript
import { createFileRoute, redirect } from '@tanstack/react-router';
import { getAuth, getSignInUrl } from '@workos/authkit-tanstack-react-start';
export const Route = createFileRoute('/dashboard')({
loader: async () => {
const { user } = await getAuth();
if (!user) {
const signInUrl = await getSignInUrl();
throw redirect({ href: signInUrl });
}
return { user };
},
component: Dashboard,
});在路由加载器中使用检查认证状态:
getAuth()typescript
import { createFileRoute, redirect } from '@tanstack/react-router';
import { getAuth, getSignInUrl } from '@workos/authkit-tanstack-react-start';
export const Route = createFileRoute('/dashboard')({
loader: async () => {
const { user } = await getAuth();
if (!user) {
const signInUrl = await getSignInUrl();
throw redirect({ href: signInUrl });
}
return { user };
},
component: Dashboard,
});Sign Out Route
退出登录路由
typescript
import { createFileRoute, redirect } from '@tanstack/react-router';
import { signOut } from '@workos/authkit-tanstack-react-start';
export const Route = createFileRoute('/signout')({
loader: async () => {
await signOut();
throw redirect({ href: '/' });
},
});typescript
import { createFileRoute, redirect } from '@tanstack/react-router';
import { signOut } from '@workos/authkit-tanstack-react-start';
export const Route = createFileRoute('/signout')({
loader: async () => {
await signOut();
throw redirect({ href: '/' });
},
});Client-Side Hooks (Optional)
客户端Hook(可选)
Only needed if you want reactive auth state in components.
1. Add AuthKitProvider to root:
typescript
// src/routes/__root.tsx
import { AuthKitProvider } from '@workos/authkit-tanstack-react-start/client';
function RootComponent() {
return (
<AuthKitProvider>
<Outlet />
</AuthKitProvider>
);
}2. Use hooks in components:
typescript
import { useAuth } from '@workos/authkit-tanstack-react-start/client';
function Profile() {
const { user, isLoading } = useAuth();
// ...
}Note: Server-side is preferred for most use cases.
getAuth()仅在需要在组件中使用响应式认证状态时需要。
1. 为根布局添加AuthKitProvider:
typescript
// src/routes/__root.tsx
import { AuthKitProvider } from '@workos/authkit-tanstack-react-start/client';
function RootComponent() {
return (
<AuthKitProvider>
<Outlet />
</AuthKitProvider>
);
}2. 在组件中使用Hook:
typescript
import { useAuth } from '@workos/authkit-tanstack-react-start/client';
function Profile() {
const { user, isLoading } = useAuth();
// ...
}注意: 大多数场景下优先使用服务端的。
getAuth()Error Recovery
错误排查
"AuthKit middleware is not configured"
"AuthKit middleware is not configured"
Cause: not in start.ts
Fix: Create/update with middleware config
Verify:
authkitMiddleware()src/start.tsgrep -r "authkitMiddleware" src/原因: 中未配置
解决方法: 创建或更新并添加中间件配置
验证:
start.tsauthkitMiddleware()src/start.tsgrep -r "authkitMiddleware" src/"Module not found" for SDK
"Module not found" for SDK
Cause: Wrong package name or not installed
Fix:
Verify:
pnpm add @workos/authkit-tanstack-react-startls node_modules/@workos/authkit-tanstack-react-start原因: 包名错误或未安装SDK
解决方法: 执行
验证:
pnpm add @workos/authkit-tanstack-react-startls node_modules/@workos/authkit-tanstack-react-startCallback 404
回调路由404
Cause: Route file path doesn't match WORKOS_REDIRECT_URI
Fix:
- URI → file
/api/auth/callback(flat) orsrc/routes/api.auth.callback.tsx(nested)app/routes/api/auth/callback.tsx - Route path string in must match exactly
createFileRoute()
原因: 路由文件路径与WORKOS_REDIRECT_URI不匹配
解决方法:
- URI为→ 对应文件为
/api/auth/callback(扁平路由)或src/routes/api.auth.callback.tsx(嵌套路由)app/routes/api/auth/callback.tsx - 中的路由路径字符串必须完全匹配
createFileRoute()
getAuth returns undefined user
getAuth返回undefined用户
Cause: Middleware not configured or not running
Fix: Ensure is in start.ts requestMiddleware array
authkitMiddleware()原因: 中间件未配置或未运行
解决方法: 确保已加入start.ts的requestMiddleware数组
authkitMiddleware()"Cookie password too short"
"Cookie password too short"
Cause: WORKOS_COOKIE_PASSWORD < 32 chars
Fix: , update .env
openssl rand -base64 32原因: WORKOS_COOKIE_PASSWORD长度不足32字符
解决方法: 执行生成新密码,更新.env文件
openssl rand -base64 32Build fails with route type errors
构建时出现路由类型错误
Cause: Route tree not regenerated after adding routes
Fix: to regenerate
pnpm devrouteTree.gen.ts原因: 添加路由后未重新生成路由树
解决方法: 执行重新生成
pnpm devrouteTree.gen.tsSDK Exports Reference
SDK导出项参考
Server (main export):
- - Request middleware
authkitMiddleware() - - OAuth callback handler
handleCallbackRoute() - - Get current session
getAuth() - - Sign out user
signOut() - /
getSignInUrl()- Auth URLsgetSignUpUrl() - - Change org context
switchToOrganization()
Client ( subpath):
/client- - Context provider
AuthKitProvider - - Auth state hook
useAuth() - - Token management
useAccessToken()
服务端(主导出):
- - 请求中间件
authkitMiddleware() - - OAuth回调处理器
handleCallbackRoute() - - 获取当前会话
getAuth() - - 退出用户登录
signOut() - /
getSignInUrl()- 认证URLgetSignUpUrl() - - 切换组织上下文
switchToOrganization()
客户端(子路径):
/client- - 上下文提供者
AuthKitProvider - - 认证状态Hook
useAuth() - - Token管理Hook
useAccessToken()