You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

51 lines
1.2 KiB

import { NextRequest, NextResponse } from "next/server";
const AUTH_EXEMPT_API_PREFIXES = [
"/api/env-status",
"/api/images/",
"/api/proxy-media",
"/api/auth/",
"/api/captcha/",
"/api/content/",
"/api/recommend-banners",
"/api/canvas-templates",
];
function hasLoginToken(request: NextRequest): boolean {
const token = request.headers.get("token")?.trim();
if (token) return true;
const userToken = request.headers.get("X-User-Token")?.trim();
if (userToken) return true;
const authorization = request.headers.get("authorization");
return /^Bearer\s+.+$/i.test(authorization || "");
}
export function proxy(request: NextRequest) {
if (request.method === "OPTIONS") {
return NextResponse.next();
}
const pathname = request.nextUrl.pathname;
if (AUTH_EXEMPT_API_PREFIXES.some((prefix) => pathname.startsWith(prefix))) {
return NextResponse.next();
}
if (!hasLoginToken(request)) {
return NextResponse.json(
{
success: false,
code: "AUTH_REQUIRED",
error: "请先登录",
},
{ status: 401 }
);
}
return NextResponse.next();
}
export const config = {
matcher: "/api/:path*",
};