mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 20:00:47 +00:00
50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
import { NextResponse } from "next/server";
|
|
import { getSettings } from "@/lib/localDb";
|
|
import bcrypt from "bcryptjs";
|
|
import { SignJWT } from "jose";
|
|
import { cookies } from "next/headers";
|
|
|
|
const SECRET = new TextEncoder().encode(
|
|
process.env.JWT_SECRET || "9router-default-secret-change-me"
|
|
);
|
|
|
|
export async function POST(request) {
|
|
try {
|
|
const { password } = await request.json();
|
|
const settings = await getSettings();
|
|
|
|
// Default password is '123456' if not set
|
|
const storedHash = settings.password;
|
|
|
|
let isValid = false;
|
|
if (storedHash) {
|
|
isValid = await bcrypt.compare(password, storedHash);
|
|
} else {
|
|
// Use env var or default
|
|
const initialPassword = process.env.INITIAL_PASSWORD || "123456";
|
|
isValid = password === initialPassword;
|
|
}
|
|
|
|
if (isValid) {
|
|
const token = await new SignJWT({ authenticated: true })
|
|
.setProtectedHeader({ alg: "HS256" })
|
|
.setExpirationTime("24h")
|
|
.sign(SECRET);
|
|
|
|
const cookieStore = await cookies();
|
|
cookieStore.set("auth_token", token, {
|
|
httpOnly: true,
|
|
secure: false, // Allow HTTP for local network access
|
|
sameSite: "lax",
|
|
path: "/",
|
|
});
|
|
|
|
return NextResponse.json({ success: true });
|
|
}
|
|
|
|
return NextResponse.json({ error: "Invalid password" }, { status: 401 });
|
|
} catch (error) {
|
|
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
}
|
|
}
|