gitdataai/admin/src/app/api/auth/login/route.ts
ZhenYi 3773fdc780 feat(admin): add structured error logger for all API routes
Replace bare console.error() calls with logError() utility across all
47 API route handlers. logError() prints timestamp + context + message
+ stack trace + extra request data to stderr, and redacts sensitive
fields (password, token, secret, key, etc.) from logged objects.
2026-04-23 09:55:35 +08:00

78 lines
2.1 KiB
TypeScript

import { logError } from "@/lib/logger";
import { NextRequest, NextResponse } from "next/server";
import { login, buildSetCookieHeader } from "@/lib/auth";
import { createAuditLog } from "@/lib/log";
export const runtime = "nodejs";
export async function POST(req: NextRequest) {
try {
const body = await req.json() as {
username?: string;
password?: string;
};
const { username = "", password = "" } = body;
if (!username || !password) {
return NextResponse.json(
{ error: "用户名和密码不能为空" },
{ status: 400 }
);
}
const result = await login(username, password);
if (!result) {
// 记录登录失败
const ip = req.headers.get("x-forwarded-for") || req.headers.get("x-real-ip") || "unknown";
const ua = req.headers.get("user-agent") || "unknown";
await createAuditLog({
userId: 0,
username,
action: "login",
resource: "auth",
result: "failure",
errorMessage: "Invalid credentials",
ipAddress: ip,
userAgent: ua,
});
return NextResponse.json(
{ error: "用户名或密码错误" },
{ status: 401 }
);
}
// 记录登录成功
const ip = req.headers.get("x-forwarded-for") || req.headers.get("x-real-ip") || "unknown";
const ua = req.headers.get("user-agent") || "unknown";
await createAuditLog({
userId: result.adminSession.userId,
username: result.adminSession.username,
action: "login",
resource: "auth",
result: "success",
ipAddress: ip,
userAgent: ua,
});
const response = NextResponse.json({
user: {
id: result.adminSession.userId,
username: result.adminSession.username,
roles: result.adminSession.roles,
permissions: result.adminSession.permissions,
},
});
response.headers.set(
"Set-Cookie",
buildSetCookieHeader(result.sessionId)
);
return response;
} catch (e) {
logError("Login error:", e);
return NextResponse.json({ error: "服务器错误" }, { status: 500 });
}
}