@betterportal/auth-default 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +12 -0
  2. package/bsb-plugin.json +23 -0
  3. package/bsb-tests.json +14 -0
  4. package/lib/defaultAuthManifest.d.ts +41 -0
  5. package/lib/defaultAuthManifest.d.ts.map +1 -0
  6. package/lib/defaultAuthManifest.js +67 -0
  7. package/lib/defaultAuthManifest.js.map +1 -0
  8. package/lib/index.d.ts +4 -0
  9. package/lib/index.d.ts.map +1 -0
  10. package/lib/index.js +4 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/plugins/service-betterportal-auth-default/.bp-generated/registry.d.ts +3 -0
  13. package/lib/plugins/service-betterportal-auth-default/.bp-generated/registry.d.ts.map +1 -0
  14. package/lib/plugins/service-betterportal-auth-default/.bp-generated/registry.js +122 -0
  15. package/lib/plugins/service-betterportal-auth-default/.bp-generated/registry.js.map +1 -0
  16. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/_nav.profile.d.ts +5 -0
  17. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/_nav.profile.d.ts.map +1 -0
  18. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/_nav.profile.js +10 -0
  19. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/_nav.profile.js.map +1 -0
  20. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/index.d.ts +4 -0
  21. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/index.d.ts.map +1 -0
  22. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/index.js +81 -0
  23. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/_theme.bootstrap1/index.js.map +1 -0
  24. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.d.ts +89 -0
  25. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.d.ts.map +1 -0
  26. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.js +186 -0
  27. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.js.map +1 -0
  28. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/_theme.bootstrap1/index.d.ts +5 -0
  29. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/_theme.bootstrap1/index.d.ts.map +1 -0
  30. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/_theme.bootstrap1/index.js +7 -0
  31. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/_theme.bootstrap1/index.js.map +1 -0
  32. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.d.ts +25 -0
  33. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.d.ts.map +1 -0
  34. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.js +38 -0
  35. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.js.map +1 -0
  36. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.d.ts +31 -0
  37. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.d.ts.map +1 -0
  38. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.js +92 -0
  39. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.js.map +1 -0
  40. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.400.d.ts +7 -0
  41. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.400.d.ts.map +1 -0
  42. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.400.js +7 -0
  43. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.400.js.map +1 -0
  44. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.d.ts +4 -0
  45. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.d.ts.map +1 -0
  46. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.js +63 -0
  47. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/_theme.bootstrap1/index.js.map +1 -0
  48. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.d.ts +64 -0
  49. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.d.ts.map +1 -0
  50. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.js +106 -0
  51. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.js.map +1 -0
  52. package/lib/plugins/service-betterportal-auth-default/index.d.ts +115 -0
  53. package/lib/plugins/service-betterportal-auth-default/index.d.ts.map +1 -0
  54. package/lib/plugins/service-betterportal-auth-default/index.js +121 -0
  55. package/lib/plugins/service-betterportal-auth-default/index.js.map +1 -0
  56. package/lib/schemas/service-betterportal-auth-default.json +145 -0
  57. package/lib/schemas/service-betterportal-auth-default.plugin.json +158 -0
  58. package/lib/userStore.d.ts +52 -0
  59. package/lib/userStore.d.ts.map +1 -0
  60. package/lib/userStore.js +132 -0
  61. package/lib/userStore.js.map +1 -0
  62. package/package.json +68 -0
@@ -0,0 +1,106 @@
1
+ import * as av from "anyvali";
2
+ import { createHandler } from "@betterportal/framework";
3
+ export const QuerySchema = av.object({
4
+ next: av.optional(av.string()).describe("The view path to pass through to login after first-admin registration.")
5
+ }, { unknownKeys: "strip" });
6
+ export const HeadersSchema = av.object({}, { unknownKeys: "strip" });
7
+ export const RequestSchema = av.object({
8
+ username: av.string().minLength(1).describe("Username for the first admin account."),
9
+ password: av.string().minLength(8).describe("Password for the first admin account."),
10
+ email: av.optional(av.string()).describe("Email address for the first admin account."),
11
+ name: av.optional(av.string()).describe("Display name for the first admin account.")
12
+ }, { unknownKeys: "strip" });
13
+ export const ResponseSchema = av.object({
14
+ status: av.enum_(["ok", "error"]).describe("Registration request outcome."),
15
+ message: av.optional(av.string()).describe("Human-readable status or error message for the renderer."),
16
+ user: av.optional(av.object({
17
+ id: av.string().describe("Stable UUIDv7 user id."),
18
+ username: av.string().describe("Created account username."),
19
+ isFirstAdmin: av.bool().describe("True when this account is the deployment's first admin.")
20
+ }, { unknownKeys: "strip" }).describe("Created first-admin user summary.")),
21
+ // GET state for the theme renderer: registrations are closed once any user
22
+ // exists; loginUrl (self-origin, absolute) is where the renderer sends the
23
+ // browser in that case - and after a successful first-admin creation.
24
+ registrationOpen: av.optional(av.bool()).describe("True while the auth service has zero users; once false, the renderer should send the browser to login."),
25
+ loginUrl: av.optional(av.string()).describe("Absolute self-origin URL of this auth service's login view, used when registration is closed and after successful first-admin creation.")
26
+ }, { unknownKeys: "strip" });
27
+ export const title = "Register First Admin";
28
+ export const description = "Open registration for the very first user. Once any user exists, this endpoint requires admin auth.";
29
+ export const role = "auth.register";
30
+ export const dependencies = ["login.index"];
31
+ export const chrome = { fullScreen: true };
32
+ export const auth = {
33
+ required: false,
34
+ permissions: []
35
+ };
36
+ export const cacheHints = {
37
+ ttlSeconds: 0,
38
+ varyBy: []
39
+ };
40
+ /** Self-origin absolute URL for a path, derived from the request Host header. */
41
+ function runtimeFrom(ctx) {
42
+ const runtime = ctx.plugin?.runtime;
43
+ if (!runtime)
44
+ throw new Error("Auth runtime not available on handler context");
45
+ return runtime;
46
+ }
47
+ function selfUrl(ctx, path, next) {
48
+ const host = ctx.headers.host;
49
+ if (!host)
50
+ return undefined;
51
+ const proto = ctx.headers["x-forwarded-proto"] ?? "http";
52
+ return `${proto}://${host}${path}${next ? `?next=${encodeURIComponent(next)}` : ""}`;
53
+ }
54
+ export const handleGet = createHandler({ response: ResponseSchema, query: QuerySchema }, (ctx) => {
55
+ const runtime = runtimeFrom(ctx);
56
+ const next = ctx.query.next;
57
+ return {
58
+ status: "ok",
59
+ registrationOpen: runtime.userStore.hasNoUsers(),
60
+ loginUrl: selfUrl(ctx, "/login", next)
61
+ };
62
+ });
63
+ export const handlePost = createHandler({ response: ResponseSchema, request: RequestSchema, query: QuerySchema }, async (ctx) => {
64
+ const runtime = runtimeFrom(ctx);
65
+ const tenantId = ctx.tenant.id;
66
+ const appId = ctx.app.id;
67
+ if (!runtime.userStore.hasNoUsers()) {
68
+ // Registration is closed once any user exists. Respond 404 so the route
69
+ // appears not to exist (no user-enumeration surface).
70
+ ctx.setStatus?.(404);
71
+ return {
72
+ status: "error",
73
+ message: ""
74
+ };
75
+ }
76
+ const body = ctx.request;
77
+ try {
78
+ const created = await runtime.userStore.createUser({
79
+ username: body.username,
80
+ password: body.password,
81
+ email: body.email,
82
+ name: body.name,
83
+ tenantId,
84
+ appRoles: { [appId]: ["admin"] }
85
+ });
86
+ return {
87
+ status: "ok",
88
+ message: "First admin created.",
89
+ user: {
90
+ id: created.id,
91
+ username: created.username,
92
+ isFirstAdmin: true
93
+ },
94
+ // For the themed success view: where to send the browser to sign in.
95
+ loginUrl: selfUrl(ctx, "/login", ctx.query.next)
96
+ };
97
+ }
98
+ catch (err) {
99
+ ctx.setStatus?.(400);
100
+ return {
101
+ status: "error",
102
+ message: err.message
103
+ };
104
+ }
105
+ });
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-default/bp-routes/register/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { type BSBServiceConstructor, type Observable } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { BPService, type BPServiceDefinition } from "@betterportal/plugin-bsb";
4
+ import { type BpTokenIssuer, type JwtVerifier } from "@betterportal/framework";
5
+ import { UserStore } from "../../userStore.js";
6
+ declare const PluginConfigSchema: av.ObjectSchema<{
7
+ host: av.StringSchema;
8
+ port: av.IntSchema;
9
+ issuer: av.StringSchema;
10
+ audience: av.StringSchema;
11
+ accessTokenSeconds: av.IntSchema;
12
+ refreshTokenSeconds: av.IntSchema;
13
+ keyStorePath: av.StringSchema;
14
+ userStorePath: av.StringSchema;
15
+ betterportal: av.OptionalSchema<av.ObjectSchema<{
16
+ bpConfigPath: av.OptionalSchema<av.StringSchema>;
17
+ configApiToken: av.OptionalSchema<av.StringSchema>;
18
+ configEncryptionKey: av.OptionalSchema<av.StringSchema>;
19
+ controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
20
+ serviceApiKey: av.OptionalSchema<av.StringSchema>;
21
+ bootstrapStatePath: av.StringSchema;
22
+ scopedConfigCachePath: av.StringSchema;
23
+ trustedProxyHeaders: av.BoolSchema;
24
+ cfProxy: av.BoolSchema;
25
+ trustedProxyIps: av.ArraySchema<av.StringSchema>;
26
+ }>>;
27
+ }>;
28
+ export type AuthPluginConfig = av.Infer<typeof PluginConfigSchema>;
29
+ declare const Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
30
+ host: av.StringSchema;
31
+ port: av.IntSchema;
32
+ issuer: av.StringSchema;
33
+ audience: av.StringSchema;
34
+ accessTokenSeconds: av.IntSchema;
35
+ refreshTokenSeconds: av.IntSchema;
36
+ keyStorePath: av.StringSchema;
37
+ userStorePath: av.StringSchema;
38
+ betterportal: av.OptionalSchema<av.ObjectSchema<{
39
+ bpConfigPath: av.OptionalSchema<av.StringSchema>;
40
+ configApiToken: av.OptionalSchema<av.StringSchema>;
41
+ configEncryptionKey: av.OptionalSchema<av.StringSchema>;
42
+ controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
43
+ serviceApiKey: av.OptionalSchema<av.StringSchema>;
44
+ bootstrapStatePath: av.StringSchema;
45
+ scopedConfigCachePath: av.StringSchema;
46
+ trustedProxyHeaders: av.BoolSchema;
47
+ cfProxy: av.BoolSchema;
48
+ trustedProxyIps: av.ArraySchema<av.StringSchema>;
49
+ }>>;
50
+ }>>;
51
+ declare const EventSchemas: {
52
+ readonly emitEvents: {};
53
+ readonly onEvents: {};
54
+ readonly emitReturnableEvents: {};
55
+ readonly onReturnableEvents: {};
56
+ readonly emitBroadcast: {};
57
+ readonly onBroadcast: {};
58
+ };
59
+ export interface DefaultAuthAppConfig {
60
+ loginRedirectPath?: string;
61
+ logoutRedirectPath?: string;
62
+ }
63
+ export declare function resolveDefaultAuthAppConfig(raw: Record<string, unknown> | undefined): DefaultAuthAppConfig;
64
+ export interface AuthRuntime {
65
+ readonly tokenIssuer: BpTokenIssuer;
66
+ readonly userStore: UserStore;
67
+ readonly accessTokenSeconds: number;
68
+ readonly refreshTokenSeconds: number;
69
+ }
70
+ export declare class Plugin extends BPService<InstanceType<typeof Config>, typeof EventSchemas> {
71
+ static Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
72
+ host: av.StringSchema;
73
+ port: av.IntSchema;
74
+ issuer: av.StringSchema;
75
+ audience: av.StringSchema;
76
+ accessTokenSeconds: av.IntSchema;
77
+ refreshTokenSeconds: av.IntSchema;
78
+ keyStorePath: av.StringSchema;
79
+ userStorePath: av.StringSchema;
80
+ betterportal: av.OptionalSchema<av.ObjectSchema<{
81
+ bpConfigPath: av.OptionalSchema<av.StringSchema>;
82
+ configApiToken: av.OptionalSchema<av.StringSchema>;
83
+ configEncryptionKey: av.OptionalSchema<av.StringSchema>;
84
+ controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
85
+ serviceApiKey: av.OptionalSchema<av.StringSchema>;
86
+ bootstrapStatePath: av.StringSchema;
87
+ scopedConfigCachePath: av.StringSchema;
88
+ trustedProxyHeaders: av.BoolSchema;
89
+ cfProxy: av.BoolSchema;
90
+ trustedProxyIps: av.ArraySchema<av.StringSchema>;
91
+ }>>;
92
+ }>>;
93
+ static EventSchemas: {
94
+ readonly emitEvents: {};
95
+ readonly onEvents: {};
96
+ readonly emitReturnableEvents: {};
97
+ readonly onReturnableEvents: {};
98
+ readonly emitBroadcast: {};
99
+ readonly onBroadcast: {};
100
+ };
101
+ private keyPair;
102
+ private userStore;
103
+ constructor(cfg: BSBServiceConstructor<InstanceType<typeof Config>, typeof EventSchemas>);
104
+ protected definition(): BPServiceDefinition;
105
+ init(obs: Observable): Promise<void>;
106
+ get runtime(): AuthRuntime;
107
+ /**
108
+ * Override BPService hook so the auth service can verify its own access tokens
109
+ * (e.g., for routes that require auth, even on the auth service itself).
110
+ */
111
+ protected getJwtVerifier(_tenantId: string, _appId: string): JwtVerifier | undefined;
112
+ private tokenIssuer;
113
+ }
114
+ export { Config, EventSchemas };
115
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-auth-default/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG1B,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAEL,SAAS,EACT,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAIL,KAAK,aAAa,EAElB,KAAK,WAAW,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAUI,CAAC;AAC7B,MAAM,MAAM,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;GAQX,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;CAOhB,CAAC;AAEH,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,oBAAoB,CAW1G;AAkBD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,qBAAa,MAAO,SAAQ,SAAS,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IACrF,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;QAAU;IACvB,MAAM,CAAC,YAAY;;;;;;;MAAgB;IAEnC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAa;gBAElB,GAAG,EAAE,qBAAqB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IAIxF,SAAS,CAAC,UAAU,IAAI,mBAAmB;IAarC,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1C,IAAI,OAAO,IAAI,WAAW,CAOzB;IAED;;;OAGG;IACH,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIpF,OAAO,CAAC,WAAW;CASpB;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,121 @@
1
+ import { createConfigSchema, createEventSchemas } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { resolve } from "node:path";
4
+ import { BetterPortalConfigSchema, BPService } from "@betterportal/plugin-bsb";
5
+ import { createBpTokenIssuer, loadOrGenerateKeyPair, publicKeyToJwk } from "@betterportal/framework";
6
+ import { UserStore } from "../../userStore.js";
7
+ import { registry } from "./.bp-generated/registry.js";
8
+ const PluginConfigSchema = av.object({
9
+ host: av.string().minLength(1).default("0.0.0.0"),
10
+ port: av.int().min(1).default(3210),
11
+ issuer: av.string().minLength(1).default("https://auth.betterportal.local"),
12
+ audience: av.string().minLength(1).default("betterportal-runtime"),
13
+ accessTokenSeconds: av.int().min(1).default(60 * 15),
14
+ refreshTokenSeconds: av.int().min(1).default(60 * 60 * 24 * 7),
15
+ keyStorePath: av.string().minLength(1).default("./.bp-auth-state/keys.json"),
16
+ userStorePath: av.string().minLength(1).default("./.bp-auth-state/users.json"),
17
+ betterportal: BetterPortalConfigSchema
18
+ }, { unknownKeys: "strip" });
19
+ const Config = createConfigSchema({
20
+ name: "service-betterportal-auth-default",
21
+ description: "Default BetterPortal v10 auth service: JWKS, login/logout/refresh, bcrypt user store",
22
+ tags: ["betterportal", "auth", "jwt", "jwks"],
23
+ documentation: ["./README.md"]
24
+ }, PluginConfigSchema);
25
+ const EventSchemas = createEventSchemas({
26
+ emitEvents: {},
27
+ onEvents: {},
28
+ emitReturnableEvents: {},
29
+ onReturnableEvents: {},
30
+ emitBroadcast: {},
31
+ onBroadcast: {}
32
+ });
33
+ export function resolveDefaultAuthAppConfig(raw) {
34
+ const loginRedirectPath = typeof raw?.loginRedirectPath === "string" && raw.loginRedirectPath.trim()
35
+ ? raw.loginRedirectPath.trim()
36
+ : undefined;
37
+ const logoutRedirectPath = typeof raw?.logoutRedirectPath === "string" && raw.logoutRedirectPath.trim()
38
+ ? raw.logoutRedirectPath.trim()
39
+ : undefined;
40
+ return {
41
+ ...(loginRedirectPath ? { loginRedirectPath } : {}),
42
+ ...(logoutRedirectPath ? { logoutRedirectPath } : {})
43
+ };
44
+ }
45
+ const DefaultAuthConfigSchemas = [{
46
+ id: "auth.default.app",
47
+ title: "Default Auth Config",
48
+ description: "App-scoped default auth settings.",
49
+ scope: "app",
50
+ jsonSchema: { loginRedirectPath: "string", logoutRedirectPath: "string" },
51
+ groups: [
52
+ { id: "login", title: "Login", description: "Routes used after signing in.", order: 10, optional: true },
53
+ { id: "logout", title: "Logout", description: "Routes used after signing out.", order: 20, optional: true }
54
+ ],
55
+ fields: [
56
+ { key: "loginRedirectPath", title: "Logged In Route", description: "Tenant route shown after signing in when no next path is supplied.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 10, defaultValue: "/", ui: { control: "select", optionsSource: "app.routes" }, required: false },
57
+ { key: "logoutRedirectPath", title: "Logged Out Route", description: "Tenant route shown after signing out.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "logout", order: 10, defaultValue: "/", ui: { control: "select", optionsSource: "app.routes" }, required: false }
58
+ ]
59
+ }];
60
+ export class Plugin extends BPService {
61
+ static Config = Config;
62
+ static EventSchemas = EventSchemas;
63
+ keyPair;
64
+ userStore;
65
+ constructor(cfg) {
66
+ super({ ...cfg, eventSchemas: EventSchemas });
67
+ }
68
+ definition() {
69
+ return {
70
+ manifest: {
71
+ pluginId: "service.betterportal.auth.default",
72
+ title: "BetterPortal Default Auth",
73
+ description: "JWT-issuing auth service (RS256 + JWKS + bcrypt user store).",
74
+ capabilities: ["auth"],
75
+ configSchemas: DefaultAuthConfigSchemas
76
+ },
77
+ registry
78
+ };
79
+ }
80
+ async init(obs) {
81
+ const cfg = this.config;
82
+ this.keyPair = loadOrGenerateKeyPair(resolve(cfg.keyStorePath));
83
+ this.userStore = new UserStore(resolve(cfg.userStorePath));
84
+ await super.init(obs);
85
+ const jwk = publicKeyToJwk(this.keyPair.publicKeyPem, this.keyPair.kid);
86
+ this.registerAsAuthProvider({
87
+ jwks: { keys: [jwk] }
88
+ });
89
+ obs.log.info("Auth service initialized: issuer={issuer} audience={audience} kid={kid}", {
90
+ issuer: cfg.issuer,
91
+ audience: cfg.audience,
92
+ kid: this.keyPair.kid
93
+ });
94
+ }
95
+ get runtime() {
96
+ return {
97
+ tokenIssuer: this.tokenIssuer(),
98
+ userStore: this.userStore,
99
+ accessTokenSeconds: this.config.accessTokenSeconds,
100
+ refreshTokenSeconds: this.config.refreshTokenSeconds
101
+ };
102
+ }
103
+ /**
104
+ * Override BPService hook so the auth service can verify its own access tokens
105
+ * (e.g., for routes that require auth, even on the auth service itself).
106
+ */
107
+ getJwtVerifier(_tenantId, _appId) {
108
+ return this.tokenIssuer().verifier("access");
109
+ }
110
+ tokenIssuer() {
111
+ return createBpTokenIssuer({
112
+ keyPair: this.keyPair,
113
+ issuer: this.config.issuer,
114
+ audience: this.config.audience,
115
+ accessTokenSeconds: this.config.accessTokenSeconds,
116
+ refreshTokenSeconds: this.config.refreshTokenSeconds
117
+ });
118
+ }
119
+ }
120
+ export { Config, EventSchemas };
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-auth-default/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ {
2
+ "pluginName": "service-betterportal-auth-default",
3
+ "events": {},
4
+ "version": "0.0.1",
5
+ "configSchema": {
6
+ "anyvaliVersion": "1.0",
7
+ "schemaVersion": "1.1",
8
+ "root": {
9
+ "kind": "object",
10
+ "properties": {
11
+ "host": {
12
+ "kind": "string",
13
+ "minLength": 1,
14
+ "default": "0.0.0.0"
15
+ },
16
+ "port": {
17
+ "kind": "int",
18
+ "min": 1,
19
+ "default": 3210
20
+ },
21
+ "issuer": {
22
+ "kind": "string",
23
+ "minLength": 1,
24
+ "default": "https://auth.betterportal.local"
25
+ },
26
+ "audience": {
27
+ "kind": "string",
28
+ "minLength": 1,
29
+ "default": "betterportal-runtime"
30
+ },
31
+ "accessTokenSeconds": {
32
+ "kind": "int",
33
+ "min": 1,
34
+ "default": 900
35
+ },
36
+ "refreshTokenSeconds": {
37
+ "kind": "int",
38
+ "min": 1,
39
+ "default": 604800
40
+ },
41
+ "keyStorePath": {
42
+ "kind": "string",
43
+ "minLength": 1,
44
+ "default": "./.bp-auth-state/keys.json"
45
+ },
46
+ "userStorePath": {
47
+ "kind": "string",
48
+ "minLength": 1,
49
+ "default": "./.bp-auth-state/users.json"
50
+ },
51
+ "betterportal": {
52
+ "kind": "optional",
53
+ "inner": {
54
+ "kind": "object",
55
+ "properties": {
56
+ "bpConfigPath": {
57
+ "kind": "optional",
58
+ "inner": {
59
+ "kind": "string",
60
+ "minLength": 1
61
+ }
62
+ },
63
+ "configApiToken": {
64
+ "kind": "optional",
65
+ "inner": {
66
+ "kind": "string",
67
+ "minLength": 1
68
+ }
69
+ },
70
+ "configEncryptionKey": {
71
+ "kind": "optional",
72
+ "inner": {
73
+ "kind": "string",
74
+ "minLength": 16
75
+ }
76
+ },
77
+ "controlPlaneUrl": {
78
+ "kind": "optional",
79
+ "inner": {
80
+ "kind": "string",
81
+ "minLength": 1
82
+ }
83
+ },
84
+ "serviceApiKey": {
85
+ "kind": "optional",
86
+ "inner": {
87
+ "kind": "string",
88
+ "minLength": 1
89
+ }
90
+ },
91
+ "bootstrapStatePath": {
92
+ "kind": "string",
93
+ "minLength": 1,
94
+ "default": "./.bp-bootstrap/state.enc"
95
+ },
96
+ "scopedConfigCachePath": {
97
+ "kind": "string",
98
+ "minLength": 1,
99
+ "default": "./.bp-sync-cache/scoped.json"
100
+ },
101
+ "trustedProxyHeaders": {
102
+ "kind": "bool",
103
+ "default": false
104
+ },
105
+ "cfProxy": {
106
+ "kind": "bool",
107
+ "default": false
108
+ },
109
+ "trustedProxyIps": {
110
+ "kind": "array",
111
+ "items": {
112
+ "kind": "string",
113
+ "minLength": 1
114
+ },
115
+ "default": []
116
+ }
117
+ },
118
+ "required": [
119
+ "bootstrapStatePath",
120
+ "scopedConfigCachePath",
121
+ "trustedProxyHeaders",
122
+ "cfProxy",
123
+ "trustedProxyIps"
124
+ ],
125
+ "unknownKeys": "strip"
126
+ }
127
+ }
128
+ },
129
+ "required": [
130
+ "host",
131
+ "port",
132
+ "issuer",
133
+ "audience",
134
+ "accessTokenSeconds",
135
+ "refreshTokenSeconds",
136
+ "keyStorePath",
137
+ "userStorePath"
138
+ ],
139
+ "unknownKeys": "strip"
140
+ },
141
+ "definitions": {},
142
+ "extensions": {}
143
+ },
144
+ "pluginType": "service"
145
+ }
@@ -0,0 +1,158 @@
1
+ {
2
+ "id": "service-betterportal-auth-default",
3
+ "name": "service-betterportal-auth-default",
4
+ "version": "0.0.1",
5
+ "description": "Default BetterPortal v10 auth service: JWKS, login/logout/refresh, bcrypt user store",
6
+ "category": "service",
7
+ "tags": [
8
+ "betterportal",
9
+ "auth",
10
+ "jwt",
11
+ "jwks"
12
+ ],
13
+ "documentation": [
14
+ "./README.md"
15
+ ],
16
+ "dependencies": [],
17
+ "author": "BetterCorp",
18
+ "license": "(AGPL-3.0-only OR Commercial)",
19
+ "configSchema": {
20
+ "anyvaliVersion": "1.0",
21
+ "schemaVersion": "1.1",
22
+ "root": {
23
+ "kind": "object",
24
+ "properties": {
25
+ "host": {
26
+ "kind": "string",
27
+ "minLength": 1,
28
+ "default": "0.0.0.0"
29
+ },
30
+ "port": {
31
+ "kind": "int",
32
+ "min": 1,
33
+ "default": 3210
34
+ },
35
+ "issuer": {
36
+ "kind": "string",
37
+ "minLength": 1,
38
+ "default": "https://auth.betterportal.local"
39
+ },
40
+ "audience": {
41
+ "kind": "string",
42
+ "minLength": 1,
43
+ "default": "betterportal-runtime"
44
+ },
45
+ "accessTokenSeconds": {
46
+ "kind": "int",
47
+ "min": 1,
48
+ "default": 900
49
+ },
50
+ "refreshTokenSeconds": {
51
+ "kind": "int",
52
+ "min": 1,
53
+ "default": 604800
54
+ },
55
+ "keyStorePath": {
56
+ "kind": "string",
57
+ "minLength": 1,
58
+ "default": "./.bp-auth-state/keys.json"
59
+ },
60
+ "userStorePath": {
61
+ "kind": "string",
62
+ "minLength": 1,
63
+ "default": "./.bp-auth-state/users.json"
64
+ },
65
+ "betterportal": {
66
+ "kind": "optional",
67
+ "inner": {
68
+ "kind": "object",
69
+ "properties": {
70
+ "bpConfigPath": {
71
+ "kind": "optional",
72
+ "inner": {
73
+ "kind": "string",
74
+ "minLength": 1
75
+ }
76
+ },
77
+ "configApiToken": {
78
+ "kind": "optional",
79
+ "inner": {
80
+ "kind": "string",
81
+ "minLength": 1
82
+ }
83
+ },
84
+ "configEncryptionKey": {
85
+ "kind": "optional",
86
+ "inner": {
87
+ "kind": "string",
88
+ "minLength": 16
89
+ }
90
+ },
91
+ "controlPlaneUrl": {
92
+ "kind": "optional",
93
+ "inner": {
94
+ "kind": "string",
95
+ "minLength": 1
96
+ }
97
+ },
98
+ "serviceApiKey": {
99
+ "kind": "optional",
100
+ "inner": {
101
+ "kind": "string",
102
+ "minLength": 1
103
+ }
104
+ },
105
+ "bootstrapStatePath": {
106
+ "kind": "string",
107
+ "minLength": 1,
108
+ "default": "./.bp-bootstrap/state.enc"
109
+ },
110
+ "scopedConfigCachePath": {
111
+ "kind": "string",
112
+ "minLength": 1,
113
+ "default": "./.bp-sync-cache/scoped.json"
114
+ },
115
+ "trustedProxyHeaders": {
116
+ "kind": "bool",
117
+ "default": false
118
+ },
119
+ "cfProxy": {
120
+ "kind": "bool",
121
+ "default": false
122
+ },
123
+ "trustedProxyIps": {
124
+ "kind": "array",
125
+ "items": {
126
+ "kind": "string",
127
+ "minLength": 1
128
+ },
129
+ "default": []
130
+ }
131
+ },
132
+ "required": [
133
+ "bootstrapStatePath",
134
+ "scopedConfigCachePath",
135
+ "trustedProxyHeaders",
136
+ "cfProxy",
137
+ "trustedProxyIps"
138
+ ],
139
+ "unknownKeys": "strip"
140
+ }
141
+ }
142
+ },
143
+ "required": [
144
+ "host",
145
+ "port",
146
+ "issuer",
147
+ "audience",
148
+ "accessTokenSeconds",
149
+ "refreshTokenSeconds",
150
+ "keyStorePath",
151
+ "userStorePath"
152
+ ],
153
+ "unknownKeys": "strip"
154
+ },
155
+ "definitions": {},
156
+ "extensions": {}
157
+ }
158
+ }