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
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;
|
|
}
|
|
|