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