import { cookieConfig, jwtConfig } from "auth/authenticate/Authenticator"; import { CustomOAuthStrategy, OAuthStrategy, PasswordStrategy } from "auth/authenticate/strategies"; import { objectTransform, s } from "bknd/utils"; export const Strategies = { password: { cls: PasswordStrategy, schema: PasswordStrategy.prototype.getSchema(), }, oauth: { cls: OAuthStrategy, schema: OAuthStrategy.prototype.getSchema(), }, custom_oauth: { cls: CustomOAuthStrategy, schema: CustomOAuthStrategy.prototype.getSchema(), }, } as const; export const STRATEGIES = Strategies; const strategiesSchemaObject = objectTransform(STRATEGIES, (strategy, name) => { return s.strictObject( { enabled: s.boolean({ default: true }).optional(), type: s.literal(name), config: strategy.schema, }, { title: name, }, ); }); const strategiesSchema = s.anyOf(Object.values(strategiesSchemaObject)); export type AppAuthStrategies = s.Static; export type AppAuthOAuthStrategy = s.Static; export type AppAuthCustomOAuthStrategy = s.Static; const guardConfigSchema = s.object({ enabled: s.boolean({ default: false }).optional(), }); export const guardRoleSchema = s.strictObject({ permissions: s.array(s.string()).optional(), is_default: s.boolean().optional(), implicit_allow: s.boolean().optional(), }); export const authConfigSchema = s.strictObject( { enabled: s.boolean({ default: false }), basepath: s.string({ default: "/api/auth" }), entity_name: s.string({ default: "users" }), allow_register: s.boolean({ default: true }).optional(), jwt: jwtConfig, cookie: cookieConfig, strategies: s.record(strategiesSchema, { title: "Strategies", default: { password: { type: "password", enabled: true, config: { hashing: "sha256", }, }, }, }), guard: guardConfigSchema.optional(), roles: s.record(guardRoleSchema, { default: {} }).optional(), }, { title: "Authentication" }, ); export type AppAuthJWTConfig = s.Static; export type AppAuthSchema = s.Static;