Panel şu ana kadar herkese açıktı — URL'yi bilen herkes kanal ekleyip/silebilir, cookie güncelleyebilir, kayıt indirebilirdi. - users tablosu (bcrypt şifre hash'i) - /login: hiç kullanıcı yoksa "ilk admin hesabı oluştur" formu, varsa normal giriş formu - jose ile imzalanmış, httpOnly çerezde tutulan 30 günlük oturum - middleware.ts: /login hariç tüm rotaları korur (video stream route'u dahil — aynı origin istekleri çerezi otomatik taşır) - layout: oturum yoksa nav hiç gösterilmiyor, varsa kullanıcı adı + çıkış butonu ekleniyor SESSION_SECRET production'da zorunlu (docker-compose derleme zamanında kontrol ediyor); Coolify'a rastgele bir değer eklendi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
22 lines
604 B
TypeScript
22 lines
604 B
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { SESSION_COOKIE_NAME, verifySessionToken } from "./lib/auth";
|
|
|
|
export async function middleware(req: NextRequest) {
|
|
if (req.nextUrl.pathname.startsWith("/login")) {
|
|
return NextResponse.next();
|
|
}
|
|
|
|
const token = req.cookies.get(SESSION_COOKIE_NAME)?.value;
|
|
const session = token ? await verifySessionToken(token) : null;
|
|
|
|
if (!session) {
|
|
return NextResponse.redirect(new URL("/login", req.url));
|
|
}
|
|
|
|
return NextResponse.next();
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
|
|
};
|