mirror of
https://github.com/Afilmory/afilmory
synced 2026-02-01 14:44:48 +00:00
- 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>
63 lines
1.9 KiB
TypeScript
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
|