gongxiangp2/lib/test-auth.ts
chenpei 4e89b57798 feat(upload): optimize upload UI and performance
- Expand batch upload list area and optimize preview image layout
- Improve upload speed tracking and display (server-side & client-side)
- Reduce network detection log noise
- Optimize Docker build process (caching, env validation)
- Add shadow environment deployment support
2026-01-28 15:07:50 +08:00

113 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 测试模式认证辅助函数
* ⚠️ 仅用于本地开发测试,生产环境不会启用
*/
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 }
}