@origins-digital/ui-auth
v2.1.0
Published
Configurable backoffice auth middleware for NestJS UIs (Bull Board, Swagger)
Readme
@origins-digital/ui-auth
Configurable backoffice login for Nest UIs (Bull Board, Swagger, or any path).
By default login is required in every environment. Pass authRequiredEnvs
to limit it (e.g. staging + production).
enforceUiAuth is the same helper in both places:
enforceUiAuth(authService)— middleware for Nest modules (Bull Board)enforceUiAuth(app, token)—app.useonpublicRoute/extraPaths(Swagger)
BullBoardModule.forRootAsync runs in its own DI context — pass the same
UiAuthModule.forRoot(...) into its imports.
Installation
npm install @origins-digital/ui-authPeer dependencies (already present in Origins Nest services): @nestjs/axios,
@nestjs/common, @nestjs/config, @nestjs/jwt, @origins-digital/cacheable,
@origins-digital/nestjs-shared-key, express, rxjs, zod.
import {
UiAuthModule,
UiAuthService,
enforceUiAuth,
DEFAULT_UI_AUTH_REQUIRED_ENVS,
} from '@origins-digital/ui-auth';
import { BullBoardModule } from '@bull-board/nestjs';
import { ExpressAdapter } from '@bull-board/express';
const uiAuthModule = UiAuthModule.forRoot({
title: 'Payment Bull Board',
authRequiredEnvs: DEFAULT_UI_AUTH_REQUIRED_ENVS, // omit for every env
// optional: appEnvKey, backofficeApiHostKey, mountPath, publicRoute
});
@Module({
imports: [
uiAuthModule,
BullBoardModule.forRootAsync({
imports: [uiAuthModule],
inject: [UiAuthService],
useFactory: (auth: UiAuthService) => ({
route: `/${auth.mountPath}`,
adapter: ExpressAdapter,
middleware: enforceUiAuth(auth),
boardOptions: { uiConfig: { boardTitle: auth.title } },
}),
}),
],
})
export class ExampleModule {}Second instance (e.g. Swagger)
Swagger lives at /docs (outside the Nest api prefix), so mount in main.ts:
import {
UiAuthModule,
SWAGGER_AUTH,
enforceUiAuth,
DEFAULT_UI_AUTH_REQUIRED_ENVS,
} from '@origins-digital/ui-auth';
const swaggerAuthModule = UiAuthModule.forRoot(
{
title: 'Payment Swagger',
publicRoute: '/docs',
cookieName: 'swagger_user_token',
cookiePath: '/',
extraPaths: ['/docs-json', '/docs-yaml'],
authRequiredEnvs: DEFAULT_UI_AUTH_REQUIRED_ENVS,
},
SWAGGER_AUTH,
);
// AppModule imports: [swaggerAuthModule, ...]
// main.ts, before initSwagger:
enforceUiAuth(app, SWAGGER_AUTH);
initSwagger(app, serviceName, version);cookiePath: '/' so /docs-json and /docs-yaml receive the same cookie.
Requires SharedKeyModule and the configured env keys (defaults: APP_ENV,
BACKOFFICE_API_HOST) in the host app.
