@backstage/backend-app-api 0.7.0 → 0.7.1-next.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @backstage/backend-app-api
2
2
 
3
+ ## 0.7.1-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 4cd5ff0: Add ability to configure the Node.js HTTP Server when configuring the root HTTP Router service
8
+ - e8199b1: Move the JWKS registration outside of the lifecycle middleware
9
+ - dc8c5dd: The default `TokenManager` implementation no longer requires keys to be configured in production, but it will throw an errors when generating or authenticating tokens. The default `AuthService` implementation will now also provide additional context if such an error is throw when falling back to using the `TokenManager` service to generate tokens for outgoing requests.
10
+ - 025641b: Redact `meta` fields too with the logger
11
+ - 5863e02: Internal refactor to only create one external token handler
12
+ - Updated dependencies
13
+ - @backstage/plugin-auth-node@0.4.13-next.0
14
+ - @backstage/backend-common@0.21.8-next.0
15
+ - @backstage/backend-plugin-api@0.6.18-next.0
16
+ - @backstage/backend-tasks@0.5.23-next.0
17
+ - @backstage/cli-common@0.1.13
18
+ - @backstage/cli-node@0.2.5
19
+ - @backstage/config@1.2.0
20
+ - @backstage/config-loader@1.8.0
21
+ - @backstage/errors@1.2.4
22
+ - @backstage/types@1.1.1
23
+ - @backstage/plugin-permission-node@0.7.29-next.0
24
+
3
25
  ## 0.7.0
4
26
 
5
27
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-app-api",
3
- "version": "0.7.0",
3
+ "version": "0.7.1-next.0",
4
4
  "main": "../dist/alpha.cjs.js",
5
5
  "types": "../dist/alpha.d.ts"
6
6
  }
package/dist/index.cjs.js CHANGED
@@ -26,10 +26,10 @@ var backendCommon = require('@backstage/backend-common');
26
26
  var jose = require('jose');
27
27
  var uuid = require('uuid');
28
28
  var pluginAuthNode = require('@backstage/plugin-auth-node');
29
+ var types = require('@backstage/types');
29
30
  var backendAppApi = require('@backstage/backend-app-api');
30
31
  var cookie = require('cookie');
31
32
  var Router = require('express-promise-router');
32
- var types = require('@backstage/types');
33
33
  var pathToRegexp = require('path-to-regexp');
34
34
  var pluginPermissionNode = require('@backstage/plugin-permission-node');
35
35
  var express = require('express');
@@ -618,7 +618,7 @@ var __accessCheck$e = (obj, member, msg) => {
618
618
  };
619
619
  var __privateGet$c = (obj, member, getter) => {
620
620
  __accessCheck$e(obj, member, "read from private field");
621
- return getter ? getter.call(obj) : member.get(obj);
621
+ return member.get(obj);
622
622
  };
623
623
  var __privateAdd$e = (obj, member, value) => {
624
624
  if (member.has(obj))
@@ -627,7 +627,7 @@ var __privateAdd$e = (obj, member, value) => {
627
627
  };
628
628
  var __privateSet$a = (obj, member, value, setter) => {
629
629
  __accessCheck$e(obj, member, "write to private field");
630
- setter ? setter.call(obj, value) : member.set(obj, value);
630
+ member.set(obj, value);
631
631
  return value;
632
632
  };
633
633
  var _config, _logger;
@@ -811,7 +811,7 @@ var __accessCheck$d = (obj, member, msg) => {
811
811
  };
812
812
  var __privateGet$b = (obj, member, getter) => {
813
813
  __accessCheck$d(obj, member, "read from private field");
814
- return getter ? getter.call(obj) : member.get(obj);
814
+ return member.get(obj);
815
815
  };
816
816
  var __privateAdd$d = (obj, member, value) => {
817
817
  if (member.has(obj))
@@ -820,7 +820,7 @@ var __privateAdd$d = (obj, member, value) => {
820
820
  };
821
821
  var __privateSet$9 = (obj, member, value, setter) => {
822
822
  __accessCheck$d(obj, member, "write to private field");
823
- setter ? setter.call(obj, value) : member.set(obj, value);
823
+ member.set(obj, value);
824
824
  return value;
825
825
  };
826
826
  var _winston, _addRedactions;
@@ -857,16 +857,21 @@ const _WinstonLogger = class _WinstonLogger {
857
857
  static redacter() {
858
858
  const redactionSet = /* @__PURE__ */ new Set();
859
859
  let redactionPattern = void 0;
860
- return {
861
- format: winston.format((info) => {
862
- if (redactionPattern && typeof info.message === "string") {
863
- info.message = info.message.replace(redactionPattern, "[REDACTED]");
864
- }
865
- if (redactionPattern && typeof info.stack === "string") {
866
- info.stack = info.stack.replace(redactionPattern, "[REDACTED]");
860
+ const replace = (obj) => {
861
+ var _a;
862
+ for (const key in obj) {
863
+ if (obj.hasOwnProperty(key)) {
864
+ if (typeof obj[key] === "object") {
865
+ obj[key] = replace(obj[key]);
866
+ } else if (typeof obj[key] === "string") {
867
+ obj[key] = (_a = obj[key]) == null ? void 0 : _a.replace(redactionPattern, "[REDACTED]");
868
+ }
867
869
  }
868
- return info;
869
- })(),
870
+ }
871
+ return obj;
872
+ };
873
+ return {
874
+ format: winston.format(replace)(),
870
875
  add(newRedactions) {
871
876
  let added = 0;
872
877
  for (const redactionToTrim of newRedactions) {
@@ -943,7 +948,7 @@ var __accessCheck$c = (obj, member, msg) => {
943
948
  };
944
949
  var __privateGet$a = (obj, member, getter) => {
945
950
  __accessCheck$c(obj, member, "read from private field");
946
- return getter ? getter.call(obj) : member.get(obj);
951
+ return member.get(obj);
947
952
  };
948
953
  var __privateAdd$c = (obj, member, value) => {
949
954
  if (member.has(obj))
@@ -952,7 +957,7 @@ var __privateAdd$c = (obj, member, value) => {
952
957
  };
953
958
  var __privateSet$8 = (obj, member, value, setter) => {
954
959
  __accessCheck$c(obj, member, "write to private field");
955
- setter ? setter.call(obj, value) : member.set(obj, value);
960
+ member.set(obj, value);
956
961
  return value;
957
962
  };
958
963
  var _hasStarted$1, _startupTasks$1, _hasShutdown, _shutdownTasks;
@@ -1037,7 +1042,7 @@ var __accessCheck$b = (obj, member, msg) => {
1037
1042
  };
1038
1043
  var __privateGet$9 = (obj, member, getter) => {
1039
1044
  __accessCheck$b(obj, member, "read from private field");
1040
- return getter ? getter.call(obj) : member.get(obj);
1045
+ return member.get(obj);
1041
1046
  };
1042
1047
  var __privateAdd$b = (obj, member, value) => {
1043
1048
  if (member.has(obj))
@@ -1046,7 +1051,7 @@ var __privateAdd$b = (obj, member, value) => {
1046
1051
  };
1047
1052
  var __privateSet$7 = (obj, member, value, setter) => {
1048
1053
  __accessCheck$b(obj, member, "write to private field");
1049
- setter ? setter.call(obj, value) : member.set(obj, value);
1054
+ member.set(obj, value);
1050
1055
  return value;
1051
1056
  };
1052
1057
  var _hasStarted, _startupTasks;
@@ -1117,7 +1122,7 @@ var __accessCheck$a = (obj, member, msg) => {
1117
1122
  };
1118
1123
  var __privateGet$8 = (obj, member, getter) => {
1119
1124
  __accessCheck$a(obj, member, "read from private field");
1120
- return getter ? getter.call(obj) : member.get(obj);
1125
+ return member.get(obj);
1121
1126
  };
1122
1127
  var __privateAdd$a = (obj, member, value) => {
1123
1128
  if (member.has(obj))
@@ -1126,7 +1131,7 @@ var __privateAdd$a = (obj, member, value) => {
1126
1131
  };
1127
1132
  var __privateSet$6 = (obj, member, value, setter) => {
1128
1133
  __accessCheck$a(obj, member, "write to private field");
1129
- setter ? setter.call(obj, value) : member.set(obj, value);
1134
+ member.set(obj, value);
1130
1135
  return value;
1131
1136
  };
1132
1137
  var __privateMethod$7 = (obj, member, method) => {
@@ -1326,7 +1331,7 @@ var __accessCheck$9 = (obj, member, msg) => {
1326
1331
  };
1327
1332
  var __privateGet$7 = (obj, member, getter) => {
1328
1333
  __accessCheck$9(obj, member, "read from private field");
1329
- return getter ? getter.call(obj) : member.get(obj);
1334
+ return member.get(obj);
1330
1335
  };
1331
1336
  var __privateAdd$9 = (obj, member, value) => {
1332
1337
  if (member.has(obj))
@@ -1335,7 +1340,7 @@ var __privateAdd$9 = (obj, member, value) => {
1335
1340
  };
1336
1341
  var __privateSet$5 = (obj, member, value, setter) => {
1337
1342
  __accessCheck$9(obj, member, "write to private field");
1338
- setter ? setter.call(obj, value) : member.set(obj, value);
1343
+ member.set(obj, value);
1339
1344
  return value;
1340
1345
  };
1341
1346
  var __privateMethod$6 = (obj, member, method) => {
@@ -1565,7 +1570,7 @@ var __accessCheck$8 = (obj, member, msg) => {
1565
1570
  };
1566
1571
  var __privateGet$6 = (obj, member, getter) => {
1567
1572
  __accessCheck$8(obj, member, "read from private field");
1568
- return getter ? getter.call(obj) : member.get(obj);
1573
+ return member.get(obj);
1569
1574
  };
1570
1575
  var __privateAdd$8 = (obj, member, value) => {
1571
1576
  if (member.has(obj))
@@ -1574,7 +1579,7 @@ var __privateAdd$8 = (obj, member, value) => {
1574
1579
  };
1575
1580
  var __privateSet$4 = (obj, member, value, setter) => {
1576
1581
  __accessCheck$8(obj, member, "write to private field");
1577
- setter ? setter.call(obj, value) : member.set(obj, value);
1582
+ member.set(obj, value);
1578
1583
  return value;
1579
1584
  };
1580
1585
  var __privateMethod$5 = (obj, member, method) => {
@@ -1865,7 +1870,7 @@ var __accessCheck$7 = (obj, member, msg) => {
1865
1870
  };
1866
1871
  var __privateGet$5 = (obj, member, getter) => {
1867
1872
  __accessCheck$7(obj, member, "read from private field");
1868
- return getter ? getter.call(obj) : member.get(obj);
1873
+ return member.get(obj);
1869
1874
  };
1870
1875
  var __privateAdd$7 = (obj, member, value) => {
1871
1876
  if (member.has(obj))
@@ -1874,7 +1879,7 @@ var __privateAdd$7 = (obj, member, value) => {
1874
1879
  };
1875
1880
  var __privateSet$3 = (obj, member, value, setter) => {
1876
1881
  __accessCheck$7(obj, member, "write to private field");
1877
- setter ? setter.call(obj, value) : member.set(obj, value);
1882
+ member.set(obj, value);
1878
1883
  return value;
1879
1884
  };
1880
1885
  var _initializer;
@@ -2142,7 +2147,12 @@ class DefaultAuthService {
2142
2147
  targetPluginId
2143
2148
  });
2144
2149
  }
2145
- return this.tokenManager.getToken();
2150
+ return this.tokenManager.getToken().catch((error) => {
2151
+ throw new errors.ForwardedError(
2152
+ `Unable to generate legacy token for communication with the '${targetPluginId}' plugin. You will typically encounter this error when attempting to call a plugin that does not exist, or is deployed with an old version of Backstage`,
2153
+ error
2154
+ );
2155
+ });
2146
2156
  case "user": {
2147
2157
  const { token } = internalForward;
2148
2158
  if (!token) {
@@ -2200,7 +2210,7 @@ var __accessCheck$5 = (obj, member, msg) => {
2200
2210
  };
2201
2211
  var __privateGet$4 = (obj, member, getter) => {
2202
2212
  __accessCheck$5(obj, member, "read from private field");
2203
- return getter ? getter.call(obj) : member.get(obj);
2213
+ return member.get(obj);
2204
2214
  };
2205
2215
  var __privateAdd$5 = (obj, member, value) => {
2206
2216
  if (member.has(obj))
@@ -2209,7 +2219,7 @@ var __privateAdd$5 = (obj, member, value) => {
2209
2219
  };
2210
2220
  var __privateSet$2 = (obj, member, value, setter) => {
2211
2221
  __accessCheck$5(obj, member, "write to private field");
2212
- setter ? setter.call(obj, value) : member.set(obj, value);
2222
+ member.set(obj, value);
2213
2223
  return value;
2214
2224
  };
2215
2225
  var _keyStore, _keyStoreUpdated;
@@ -2287,7 +2297,7 @@ class PluginTokenHandler {
2287
2297
  options.logger,
2288
2298
  options.ownPluginId,
2289
2299
  options.publicKeyStore,
2290
- options.keyDurationSeconds,
2300
+ Math.round(types.durationToMilliseconds(options.keyDuration) / 1e3),
2291
2301
  (_a = options.algorithm) != null ? _a : "ES256",
2292
2302
  options.discovery
2293
2303
  );
@@ -2572,7 +2582,7 @@ var __accessCheck$3 = (obj, member, msg) => {
2572
2582
  };
2573
2583
  var __privateGet$3 = (obj, member, getter) => {
2574
2584
  __accessCheck$3(obj, member, "read from private field");
2575
- return getter ? getter.call(obj) : member.get(obj);
2585
+ return member.get(obj);
2576
2586
  };
2577
2587
  var __privateAdd$3 = (obj, member, value) => {
2578
2588
  if (member.has(obj))
@@ -2646,7 +2656,7 @@ var __accessCheck$2 = (obj, member, msg) => {
2646
2656
  };
2647
2657
  var __privateGet$2 = (obj, member, getter) => {
2648
2658
  __accessCheck$2(obj, member, "read from private field");
2649
- return getter ? getter.call(obj) : member.get(obj);
2659
+ return member.get(obj);
2650
2660
  };
2651
2661
  var __privateAdd$2 = (obj, member, value) => {
2652
2662
  if (member.has(obj))
@@ -2748,7 +2758,16 @@ const authServiceFactory = backendPluginApi.createServiceFactory({
2748
2758
  // new auth services in the new backend system.
2749
2759
  tokenManager: backendPluginApi.coreServices.tokenManager
2750
2760
  },
2751
- async factory({ config, discovery, plugin, tokenManager, logger, database }) {
2761
+ async createRootContext({ config, logger }) {
2762
+ const externalTokens = ExternalTokenHandler.create({
2763
+ config,
2764
+ logger
2765
+ });
2766
+ return {
2767
+ externalTokens
2768
+ };
2769
+ },
2770
+ async factory({ config, discovery, plugin, tokenManager, logger, database }, { externalTokens }) {
2752
2771
  const disableDefaultAuthPolicy = Boolean(
2753
2772
  config.getOptionalBoolean(
2754
2773
  "backend.auth.dangerouslyDisableDefaultAuthPolicy"
@@ -2763,15 +2782,11 @@ const authServiceFactory = backendPluginApi.createServiceFactory({
2763
2782
  });
2764
2783
  const pluginTokens = PluginTokenHandler.create({
2765
2784
  ownPluginId: plugin.getId(),
2766
- keyDurationSeconds: 60 * 60,
2785
+ keyDuration: { hours: 1 },
2767
2786
  logger,
2768
2787
  publicKeyStore,
2769
2788
  discovery
2770
2789
  });
2771
- const externalTokens = ExternalTokenHandler.create({
2772
- config,
2773
- logger
2774
- });
2775
2790
  return new DefaultAuthService(
2776
2791
  userTokens,
2777
2792
  pluginTokens,
@@ -2935,7 +2950,7 @@ var __accessCheck$1 = (obj, member, msg) => {
2935
2950
  };
2936
2951
  var __privateGet$1 = (obj, member, getter) => {
2937
2952
  __accessCheck$1(obj, member, "read from private field");
2938
- return getter ? getter.call(obj) : member.get(obj);
2953
+ return member.get(obj);
2939
2954
  };
2940
2955
  var __privateAdd$1 = (obj, member, value) => {
2941
2956
  if (member.has(obj))
@@ -2944,7 +2959,7 @@ var __privateAdd$1 = (obj, member, value) => {
2944
2959
  };
2945
2960
  var __privateSet$1 = (obj, member, value, setter) => {
2946
2961
  __accessCheck$1(obj, member, "write to private field");
2947
- setter ? setter.call(obj, value) : member.set(obj, value);
2962
+ member.set(obj, value);
2948
2963
  return value;
2949
2964
  };
2950
2965
  var __privateMethod$1 = (obj, member, method) => {
@@ -3314,8 +3329,8 @@ const httpRouterServiceFactory = backendPluginApi.createServiceFactory(
3314
3329
  httpAuth,
3315
3330
  config
3316
3331
  });
3317
- router.use(createLifecycleMiddleware({ lifecycle }));
3318
3332
  router.use(createAuthIntegrationRouter({ auth }));
3333
+ router.use(createLifecycleMiddleware({ lifecycle }));
3319
3334
  router.use(credentialsBarrier.middleware);
3320
3335
  router.use(createCookieAuthRefreshMiddleware({ auth, httpAuth }));
3321
3336
  return {
@@ -3376,7 +3391,7 @@ var __accessCheck = (obj, member, msg) => {
3376
3391
  };
3377
3392
  var __privateGet = (obj, member, getter) => {
3378
3393
  __accessCheck(obj, member, "read from private field");
3379
- return getter ? getter.call(obj) : member.get(obj);
3394
+ return member.get(obj);
3380
3395
  };
3381
3396
  var __privateAdd = (obj, member, value) => {
3382
3397
  if (member.has(obj))
@@ -3385,7 +3400,7 @@ var __privateAdd = (obj, member, value) => {
3385
3400
  };
3386
3401
  var __privateSet = (obj, member, value, setter) => {
3387
3402
  __accessCheck(obj, member, "write to private field");
3388
- setter ? setter.call(obj, value) : member.set(obj, value);
3403
+ member.set(obj, value);
3389
3404
  return value;
3390
3405
  };
3391
3406
  var __privateMethod = (obj, member, method) => {
@@ -3467,15 +3482,8 @@ findConflictingPath_fn = function(newPath) {
3467
3482
  };
3468
3483
  let DefaultRootHttpRouter = _DefaultRootHttpRouter;
3469
3484
 
3470
- function defaultConfigure(context) {
3471
- const { app, routes, middleware } = context;
3472
- app.use(middleware.helmet());
3473
- app.use(middleware.cors());
3474
- app.use(middleware.compression());
3475
- app.use(middleware.logging());
3476
- app.use(routes);
3477
- app.use(middleware.notFound());
3478
- app.use(middleware.error());
3485
+ function defaultConfigure({ applyDefaults }) {
3486
+ applyDefaults();
3479
3487
  }
3480
3488
  const rootHttpRouterServiceFactory = backendPluginApi.createServiceFactory(
3481
3489
  (options) => ({
@@ -3491,19 +3499,30 @@ const rootHttpRouterServiceFactory = backendPluginApi.createServiceFactory(
3491
3499
  const app = express__default.default();
3492
3500
  const router = DefaultRootHttpRouter.create({ indexPath });
3493
3501
  const middleware = MiddlewareFactory.create({ config, logger });
3502
+ const routes = router.handler();
3503
+ const server = await createHttpServer(
3504
+ app,
3505
+ readHttpServerOptions(config.getOptionalConfig("backend")),
3506
+ { logger }
3507
+ );
3494
3508
  configure({
3495
3509
  app,
3496
- routes: router.handler(),
3510
+ server,
3511
+ routes,
3497
3512
  middleware,
3498
3513
  config,
3499
3514
  logger,
3500
- lifecycle
3515
+ lifecycle,
3516
+ applyDefaults() {
3517
+ app.use(middleware.helmet());
3518
+ app.use(middleware.cors());
3519
+ app.use(middleware.compression());
3520
+ app.use(middleware.logging());
3521
+ app.use(routes);
3522
+ app.use(middleware.notFound());
3523
+ app.use(middleware.error());
3524
+ }
3501
3525
  });
3502
- const server = await createHttpServer(
3503
- app,
3504
- readHttpServerOptions(config.getOptionalConfig("backend")),
3505
- { logger }
3506
- );
3507
3526
  lifecycle.addShutdownHook(() => server.stop());
3508
3527
  await server.start();
3509
3528
  return router;
@@ -3557,7 +3576,8 @@ const tokenManagerServiceFactory = backendPluginApi.createServiceFactory({
3557
3576
  },
3558
3577
  createRootContext({ config, logger }) {
3559
3578
  return backendCommon.ServerTokenManager.fromConfig(config, {
3560
- logger
3579
+ logger,
3580
+ allowDisabledTokenManager: true
3561
3581
  });
3562
3582
  },
3563
3583
  async factory(_deps, tokenManager) {