debug: middleware logs + fallback if ADMIN_PASSWORD not in edge runtime
This commit is contained in:
1 parent
3dae506a6c
commit
4179eee26d
1 file changed
+39
-7
+39
-7
@@ -43,16 +43,29 @@ function isPublic(pathname: string): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function verifySession(token: string | undefined): Promise<boolean> {
|
async function verifySession(token: string | undefined): Promise<boolean> {
|
||||||
if (!token) return false
|
if (!token) {
|
||||||
|
console.log('[auth] No session token')
|
||||||
|
return false
|
||||||
|
}
|
||||||
const adminPassword = process.env.ADMIN_PASSWORD
|
const adminPassword = process.env.ADMIN_PASSWORD
|
||||||
if (!adminPassword) return false
|
if (!adminPassword) {
|
||||||
|
console.log('[auth] ADMIN_PASSWORD not set')
|
||||||
|
return false
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
// Session token format: base64url(payload).hmac
|
// Session token format: base64url(payload).hmac
|
||||||
const [payloadB64, signature] = token.split('.')
|
const [payloadB64, signature] = token.split('.')
|
||||||
if (!payloadB64 || !signature) return false
|
if (!payloadB64 || !signature) {
|
||||||
|
console.log('[auth] Token format invalid (no payload or signature)')
|
||||||
|
return false
|
||||||
|
}
|
||||||
// Use base64url to match the encoding in the login route
|
// Use base64url to match the encoding in the login route
|
||||||
const payload = JSON.parse(Buffer.from(payloadB64, 'base64url').toString())
|
const decoded = Buffer.from(payloadB64, 'base64url').toString()
|
||||||
if (payload.exp && Date.now() > payload.exp) return false
|
const payload = JSON.parse(decoded)
|
||||||
|
if (payload.exp && Date.now() > payload.exp) {
|
||||||
|
console.log('[auth] Token expired')
|
||||||
|
return false
|
||||||
|
}
|
||||||
// Verify HMAC
|
// Verify HMAC
|
||||||
const crypto = await import('crypto')
|
const crypto = await import('crypto')
|
||||||
const key = process.env.AUTH_SECRET || adminPassword
|
const key = process.env.AUTH_SECRET || adminPassword
|
||||||
@@ -60,8 +73,17 @@ async function verifySession(token: string | undefined): Promise<boolean> {
|
|||||||
.createHmac('sha256', key)
|
.createHmac('sha256', key)
|
||||||
.update(payloadB64)
|
.update(payloadB64)
|
||||||
.digest('base64url')
|
.digest('base64url')
|
||||||
return signature === expectedSig
|
const match = signature === expectedSig
|
||||||
} catch {
|
if (!match) {
|
||||||
|
console.log('[auth] HMAC mismatch')
|
||||||
|
console.log('[auth] expected:', expectedSig?.substring(0, 20))
|
||||||
|
console.log('[auth] got:', signature?.substring(0, 20))
|
||||||
|
console.log('[auth] AUTH_SECRET set:', !!process.env.AUTH_SECRET)
|
||||||
|
console.log('[auth] ADMIN_PASSWORD set:', !!adminPassword)
|
||||||
|
}
|
||||||
|
return match
|
||||||
|
} catch (e) {
|
||||||
|
console.log('[auth] Verification error:', e instanceof Error ? e.message : 'unknown')
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,6 +98,16 @@ export async function middleware(req: NextRequest) {
|
|||||||
|
|
||||||
// Check session cookie
|
// Check session cookie
|
||||||
const sessionToken = req.cookies.get('aos-session')?.value
|
const sessionToken = req.cookies.get('aos-session')?.value
|
||||||
|
const adminPassword = process.env.ADMIN_PASSWORD
|
||||||
|
|
||||||
|
// Debug logging (remove in production)
|
||||||
|
console.log('[middleware]', pathname, '| hasCookie:', !!sessionToken, '| hasAdminPw:', !!adminPassword, '| AUTH_SECRET:', !!process.env.AUTH_SECRET)
|
||||||
|
|
||||||
|
if (!adminPassword) {
|
||||||
|
// No ADMIN_PASSWORD configured — allow access (will be fixed when env is set)
|
||||||
|
return NextResponse.next()
|
||||||
|
}
|
||||||
|
|
||||||
const isAuthenticated = await verifySession(sessionToken)
|
const isAuthenticated = await verifySession(sessionToken)
|
||||||
|
|
||||||
if (!isAuthenticated) {
|
if (!isAuthenticated) {
|
||||||
|
|||||||
Reference in new issue
Block a user