Self-hosted dashboard and admin auth (#4837)

Co-authored-by: kartik-mem0 <kartik.labhshetwar@mem0.ai>
This commit is contained in:
Gabriel Stein
2026-04-23 19:06:36 +05:30
committed by GitHub
co-authored by kartik-mem0
parent 15feaa8ac4
commit db8ac61713
252 changed files with 20275 additions and 331 deletions
@@ -0,0 +1,61 @@
import { cookies } from "next/headers";
import { NextRequest, NextResponse } from "next/server";
import { AUTH_ENDPOINTS } from "@/utils/api-endpoints";
import { getServerApiUrl } from "@/lib/server-api-url";
const COOKIE_NAME = "mem0_refresh_token";
const COOKIE_OPTIONS = {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "lax" as const,
path: "/",
maxAge: 30 * 24 * 60 * 60, // 30 days
};
export async function POST() {
const cookieStore = await cookies();
const refreshToken = cookieStore.get(COOKIE_NAME)?.value;
if (!refreshToken) {
return NextResponse.json({ error: "No refresh token" }, { status: 401 });
}
const res = await fetch(`${getServerApiUrl()}${AUTH_ENDPOINTS.REFRESH}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ refresh_token: refreshToken }),
});
if (!res.ok) {
// Refresh token is invalid — clear cookie
cookieStore.delete(COOKIE_NAME);
return NextResponse.json({ error: "Refresh failed" }, { status: 401 });
}
const data = await res.json();
cookieStore.set(COOKIE_NAME, data.refresh_token, COOKIE_OPTIONS);
return NextResponse.json({ access_token: data.access_token });
}
export async function PUT(request: NextRequest) {
const body = await request.json();
const cookieStore = await cookies();
if (!body.refresh_token) {
return NextResponse.json(
{ error: "Missing refresh_token" },
{ status: 400 },
);
}
cookieStore.set(COOKIE_NAME, body.refresh_token, COOKIE_OPTIONS);
return NextResponse.json({ ok: true });
}
export async function DELETE() {
const cookieStore = await cookies();
cookieStore.delete(COOKIE_NAME);
return NextResponse.json({ ok: true });
}
@@ -0,0 +1,6 @@
export const GET = async () => {
return new Response(JSON.stringify({ status: "ok" }), {
status: 200,
headers: { "Content-Type": "application/json" },
});
};