-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmiddleware.ts
More file actions
37 lines (32 loc) · 2.01 KB
/
Copy pathmiddleware.ts
File metadata and controls
37 lines (32 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import { NextRequest, NextResponse } from 'next/server'
export const config = {
matcher: ['/dashboard/:path*'],
runtime: 'nodejs',
}
export function middleware(request: NextRequest) {
const secret = process.env.DASHBOARD_SECRET
if (!secret) {
return new NextResponse('DASHBOARD_SECRET no configurado', { status: 500 })
}
const cookieAuth = request.cookies.get('dashboard-auth')?.value
if (cookieAuth === secret) {
return NextResponse.next()
}
const paramSecret = request.nextUrl.searchParams.get('secret')
if (paramSecret === secret) {
const url = new URL(request.nextUrl.pathname, request.url)
const response = NextResponse.redirect(url)
response.cookies.set('dashboard-auth', secret, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 60 * 60 * 24 * 30,
path: '/dashboard',
})
return response
}
return new NextResponse(
'<!DOCTYPE html><html lang="es"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>Dashboard</title><style>body{font-family:system-ui,sans-serif;background:#09090b;color:#fafafa;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0}form{background:#18181b;padding:2rem;border-radius:.75rem;border:1px solid #27272a;max-width:360px;width:100%}h1{font-size:1.25rem;margin:0 0 1.5rem}input{width:100%;padding:.625rem;border-radius:.5rem;border:1px solid #3f3f46;background:#09090b;color:#fafafa;font-size:.875rem;box-sizing:border-box}button{margin-top:1rem;width:100%;padding:.625rem;border-radius:.5rem;border:none;background:#3b82f6;color:#fff;font-weight:600;cursor:pointer;font-size:.875rem}button:hover{background:#2563eb}</style></head><body><form method="GET"><h1>Dashboard Digitalo</h1><input type="password" name="secret" placeholder="Clave de acceso" required autofocus><button type="submit">Entrar</button></form></body></html>',
{ status: 401, headers: { 'content-type': 'text/html; charset=utf-8' } }
)
}