gongxiangp2/lib/upload-auth.ts

28 lines
1.3 KiB
TypeScript

import { getServerSession } from 'next-auth'
import type { NextRequest } from 'next/server'
import { authOptions } from '@/lib/auth'
import {
DINGTALK_PERFORMANCE_SESSION_HEADER,
verifyDingtalkPerformanceSessionToken,
} from '@/lib/dingtalk-performance-session'
import { DINGTALK_PERFORMANCE_SESSION_COOKIE } from '@/lib/dingtalk-performance-session-constants'
export async function getAuthenticatedUploadUserId(request: NextRequest): Promise<string | null> {
const session = await getServerSession(authOptions)
const sessionUserId = String((session?.user as any)?.id || '').trim()
if (sessionUserId) return sessionUserId
const headerToken = request.headers.get(DINGTALK_PERFORMANCE_SESSION_HEADER)
const authorization = request.headers.get('authorization') || ''
const bearerToken = authorization.match(/^Bearer\s+(.+)$/i)?.[1]?.trim()
const cookieHeader = request.headers.get('cookie') || ''
const cookieToken = cookieHeader
.split(';')
.map((part) => part.trim())
.find((part) => part.startsWith(`${DINGTALK_PERFORMANCE_SESSION_COOKIE}=`))
?.slice(DINGTALK_PERFORMANCE_SESSION_COOKIE.length + 1)
.trim()
const payload = verifyDingtalkPerformanceSessionToken(headerToken || bearerToken || cookieToken || null)
return payload?.userId ? String(payload.userId).trim() : null
}