Files
afilmory/be/apps/oauth-gateway/src/config.ts
Innei 74584cd230 feat(oauth-gateway): implement multi-tenant OAuth gateway service
- Added a new OAuth gateway service to handle multi-tenant authentication callbacks.
- Implemented routing logic for provider callbacks, including tenant slug validation and host resolution.
- Introduced configuration management for environment variables and service settings.
- Created Dockerfile and package.json for service deployment and dependencies.
- Added HTML response for restricted tenant access and updated static web components accordingly.

Signed-off-by: Innei <tukon479@gmail.com>
2025-11-12 16:33:24 +08:00

63 lines
1.9 KiB
TypeScript

import { DEFAULT_BASE_DOMAIN } from '@afilmory/utils'
import { z } from 'zod'
const booleanSchema = z
.union([z.boolean(), z.string()])
.optional()
.transform((value) => {
if (typeof value === 'boolean') {
return value
}
if (value === undefined) {
return
}
const normalized = value.trim().toLowerCase()
return !['false', '0', 'no', 'off'].includes(normalized)
})
const envSchema = z.object({
HOST: z.string().trim().min(1).default('0.0.0.0'),
PORT: z.coerce.number().int().min(1).max(65_535).default(8790),
BASE_DOMAIN: z
.string()
.trim()
.min(1)
.regex(/^[a-z0-9.-]+$/i, { message: 'BASE_DOMAIN must be a valid hostname.' })
.default(DEFAULT_BASE_DOMAIN),
FORCE_HTTPS: booleanSchema.default(true),
CALLBACK_BASE_PATH: z
.string()
.trim()
.default('/api/auth/callback')
.transform((value) => value.replace(/\/+$/, '') || '/api/auth/callback'),
ALLOW_CUSTOM_HOST: booleanSchema.default(false),
ROOT_SLUG: z
.string()
.trim()
.min(1)
.regex(/^[a-z0-9-]+$/i)
.default('root'),
})
const parsed = envSchema.parse({
HOST: process.env.AUTH_GATEWAY_HOST ?? process.env.HOST,
PORT: process.env.AUTH_GATEWAY_PORT ?? process.env.PORT,
BASE_DOMAIN: process.env.AUTH_GATEWAY_BASE_DOMAIN,
FORCE_HTTPS: process.env.AUTH_GATEWAY_FORCE_HTTPS,
CALLBACK_BASE_PATH: process.env.AUTH_GATEWAY_CALLBACK_BASE_PATH,
ALLOW_CUSTOM_HOST: process.env.AUTH_GATEWAY_ALLOW_CUSTOM_HOST,
ROOT_SLUG: process.env.AUTH_GATEWAY_ROOT_SLUG,
})
export const gatewayConfig = {
host: parsed.HOST,
port: parsed.PORT,
baseDomain: parsed.BASE_DOMAIN.toLowerCase(),
forceHttps: Boolean(parsed.FORCE_HTTPS),
callbackBasePath: parsed.CALLBACK_BASE_PATH,
allowCustomHost: Boolean(parsed.ALLOW_CUSTOM_HOST),
rootSlug: parsed.ROOT_SLUG.toLowerCase(),
} as const
export type GatewayConfig = typeof gatewayConfig