28 lines
1.3 KiB
TypeScript
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
|
|
}
|