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.
 
 

75 lines
2.1 KiB

import type { NextRequest } from "next/server";
import {
LEGACY_NEWAPIWG_API_KEY_HEADER,
NEWAPIWG_API_KEY_HEADER,
} from "@/utils/gatewayHeaders";
import { ApiError } from "./_errors";
export interface LoginContext {
token: string;
}
export function getRequestToken(request: Request | NextRequest): string | null {
const tokenHeader = request.headers.get("token");
if (tokenHeader?.trim()) return tokenHeader.trim();
const userTokenHeader = request.headers.get("X-User-Token");
if (userTokenHeader?.trim()) return userTokenHeader.trim();
const userAuthorization = request.headers.get("X-User-Authorization");
const userBearerToken = userAuthorization?.match(/^Bearer\s+(.+)$/i)?.[1];
if (userBearerToken?.trim()) return userBearerToken.trim();
const authorization = request.headers.get("authorization");
const bearerToken = authorization?.match(/^Bearer\s+(.+)$/i)?.[1];
return bearerToken?.trim() || null;
}
export function getRequestGatewayApiKey(request: Request | NextRequest): string | null {
return (
request.headers.get(NEWAPIWG_API_KEY_HEADER)?.trim() ||
request.headers.get(LEGACY_NEWAPIWG_API_KEY_HEADER)?.trim() ||
null
);
}
export function requireLogin(request: Request | NextRequest): LoginContext {
const token = getRequestToken(request);
if (!token) {
throw ApiError.unauthorized();
}
return { token };
}
export function buildUserForwardHeaders(token?: string | null): Record<string, string> {
if (!token?.trim()) return {};
const normalizedToken = token.trim();
return {
"X-User-Authorization": `Bearer ${normalizedToken}`,
"X-User-Token": normalizedToken,
token: normalizedToken,
};
}
export function buildGatewayHeaders(
apiKey: string,
loginToken?: string | null,
extraHeaders?: Record<string, string>
): Record<string, string> {
return {
...(extraHeaders || {}),
Authorization: `Bearer ${apiKey}`,
...buildUserForwardHeaders(loginToken),
};
}
export function requireConfiguredValue(
value: string | null | undefined,
message: string,
status = 401
): string {
if (!value) {
throw ApiError.config(message, status);
}
return value;
}