/** * 测试模式认证辅助函数 * ⚠️ 仅用于本地开发测试,生产环境不会启用 */ import { NextRequest, NextResponse } from 'next/server' import { getServerSession } from 'next-auth' import { authOptions } from './auth' const TEST_MODE = process.env.TEST_MODE === 'true' const ADMIN_API_KEY = process.env.ADMIN_API_KEY /** * 检查是否在测试模式 * 测试模式下可以通过以下方式跳过认证: * 1. URL 参数 ?test=true * 2. Header x-test-mode: true * 3. Header x-admin-api-key: ADMIN_API_KEY */ export function isTestModeRequest(request: NextRequest): boolean { if (!TEST_MODE) { return false } // 检查 URL 参数 const urlParam = request.nextUrl.searchParams.get('test') if (urlParam === 'true') { console.log('[TestAuth] 测试模式已启用(URL参数)') return true } // 检查 Header const testHeader = request.headers.get('x-test-mode') if (testHeader === 'true') { console.log('[TestAuth] 测试模式已启用(Header)') return true } // 检查 Admin API Key const apiKey = request.headers.get('x-admin-api-key') if (apiKey === ADMIN_API_KEY) { console.log('[TestAuth] 测试模式已启用(Admin API Key)') return true } return false } /** * 获取 Session 或跳过认证(测试模式) * @returns { session: Session | null, isTestMode: boolean } */ export async function getSessionOrSkipAuth(request: NextRequest): Promise<{ session: any isTestMode: boolean }> { // 检查是否为测试模式请求 if (isTestModeRequest(request)) { return { session: { user: { id: 'test-user-id', name: 'Test User', email: 'test@example.com', role: 'ADMIN', canDownload: true, }, }, isTestMode: true, } } // 正常认证流程 const session = await getServerSession(authOptions) return { session, isTestMode: false, } } /** * API 路由认证检查中间件 * 如果认证失败,返回 401 响应 * @returns { success: boolean, session: any, isTestMode: boolean, error?: NextResponse } */ export async function checkAuthForApi( request: NextRequest ): Promise<{ success: boolean session: any isTestMode: boolean error?: NextResponse }> { const { session, isTestMode } = await getSessionOrSkipAuth(request) // 测试模式直接通过 if (isTestMode) { return { success: true, session, isTestMode } } // 检查正常认证 if (!session || !session.user || !(session.user as any).id) { return { success: false, session: null, isTestMode: false, error: NextResponse.json({ error: '未登录' }, { status: 401 }), } } return { success: true, session, isTestMode } }