55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { headers } from "next/headers"
|
|
import { NextResponse } from "next/server"
|
|
import {
|
|
ADMIN_SESSION_COOKIE,
|
|
createAdminSession,
|
|
isAdminCredentialLoginConfigured,
|
|
isAdminCredentialMatch,
|
|
} from "@/lib/server/admin-auth"
|
|
|
|
export async function POST(request: Request) {
|
|
if (!isAdminCredentialLoginConfigured()) {
|
|
return NextResponse.redirect(
|
|
new URL("/sign-in?error=config", await getPublicOrigin(request))
|
|
)
|
|
}
|
|
|
|
const formData = await request.formData()
|
|
const email = String(formData.get("email") || "")
|
|
.trim()
|
|
.toLowerCase()
|
|
const password = String(formData.get("password") || "")
|
|
|
|
if (!isAdminCredentialMatch(email, password)) {
|
|
return NextResponse.redirect(
|
|
new URL("/sign-in?error=invalid", await getPublicOrigin(request))
|
|
)
|
|
}
|
|
|
|
const session = await createAdminSession(email)
|
|
const response = NextResponse.redirect(
|
|
new URL("/admin", await getPublicOrigin(request))
|
|
)
|
|
response.cookies.set(ADMIN_SESSION_COOKIE, session.token, {
|
|
httpOnly: true,
|
|
sameSite: "lax",
|
|
secure: true,
|
|
path: "/",
|
|
expires: new Date(session.expiresAt),
|
|
})
|
|
|
|
return response
|
|
}
|
|
|
|
async function getPublicOrigin(request: Request) {
|
|
const headerStore = await headers()
|
|
const forwardedProto = headerStore.get("x-forwarded-proto")
|
|
const forwardedHost = headerStore.get("x-forwarded-host")
|
|
const host = forwardedHost || headerStore.get("host")
|
|
|
|
if (host) {
|
|
return `${forwardedProto || "https"}://${host}`
|
|
}
|
|
|
|
return new URL(request.url).origin
|
|
}
|