@backstage/backend-app-api 0.7.2 → 0.7.3-next.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.
package/CHANGELOG.md CHANGED
@@ -1,16 +1,40 @@
1
1
  # @backstage/backend-app-api
2
2
 
3
- ## 0.7.2
3
+ ## 0.7.2-next.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - b6b59c5: Redact `meta` fields too with the logger
7
+ - 09f8988: Remove explicit `alg` check for user tokens in `verifyToken`
8
+ - Updated dependencies
9
+ - @backstage/backend-common@0.22.0-next.1
10
+ - @backstage/backend-tasks@0.5.23-next.1
11
+ - @backstage/plugin-auth-node@0.4.13-next.1
12
+ - @backstage/plugin-permission-node@0.7.29-next.1
13
+ - @backstage/cli-node@0.2.5
14
+ - @backstage/config-loader@1.8.0
15
+ - @backstage/backend-plugin-api@0.6.18-next.1
8
16
 
9
- ## 0.7.1
17
+ ## 0.7.1-next.0
10
18
 
11
19
  ### Patch Changes
12
20
 
13
- - 3554ebe: Move the JWKS registration outside of the lifecycle middleware
21
+ - 4cd5ff0: Add ability to configure the Node.js HTTP Server when configuring the root HTTP Router service
22
+ - e8199b1: Move the JWKS registration outside of the lifecycle middleware
23
+ - 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.
24
+ - 025641b: Redact `meta` fields too with the logger
25
+ - 5863e02: Internal refactor to only create one external token handler
26
+ - Updated dependencies
27
+ - @backstage/plugin-auth-node@0.4.13-next.0
28
+ - @backstage/backend-common@0.21.8-next.0
29
+ - @backstage/backend-plugin-api@0.6.18-next.0
30
+ - @backstage/backend-tasks@0.5.23-next.0
31
+ - @backstage/cli-common@0.1.13
32
+ - @backstage/cli-node@0.2.5
33
+ - @backstage/config@1.2.0
34
+ - @backstage/config-loader@1.8.0
35
+ - @backstage/errors@1.2.4
36
+ - @backstage/types@1.1.1
37
+ - @backstage/plugin-permission-node@0.7.29-next.0
14
38
 
15
39
  ## 0.7.0
16
40
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-app-api",
3
- "version": "0.7.2",
3
+ "version": "0.7.3-next.1",
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;
@@ -948,7 +948,7 @@ var __accessCheck$c = (obj, member, msg) => {
948
948
  };
949
949
  var __privateGet$a = (obj, member, getter) => {
950
950
  __accessCheck$c(obj, member, "read from private field");
951
- return getter ? getter.call(obj) : member.get(obj);
951
+ return member.get(obj);
952
952
  };
953
953
  var __privateAdd$c = (obj, member, value) => {
954
954
  if (member.has(obj))
@@ -957,7 +957,7 @@ var __privateAdd$c = (obj, member, value) => {
957
957
  };
958
958
  var __privateSet$8 = (obj, member, value, setter) => {
959
959
  __accessCheck$c(obj, member, "write to private field");
960
- setter ? setter.call(obj, value) : member.set(obj, value);
960
+ member.set(obj, value);
961
961
  return value;
962
962
  };
963
963
  var _hasStarted$1, _startupTasks$1, _hasShutdown, _shutdownTasks;
@@ -1042,7 +1042,7 @@ var __accessCheck$b = (obj, member, msg) => {
1042
1042
  };
1043
1043
  var __privateGet$9 = (obj, member, getter) => {
1044
1044
  __accessCheck$b(obj, member, "read from private field");
1045
- return getter ? getter.call(obj) : member.get(obj);
1045
+ return member.get(obj);
1046
1046
  };
1047
1047
  var __privateAdd$b = (obj, member, value) => {
1048
1048
  if (member.has(obj))
@@ -1051,7 +1051,7 @@ var __privateAdd$b = (obj, member, value) => {
1051
1051
  };
1052
1052
  var __privateSet$7 = (obj, member, value, setter) => {
1053
1053
  __accessCheck$b(obj, member, "write to private field");
1054
- setter ? setter.call(obj, value) : member.set(obj, value);
1054
+ member.set(obj, value);
1055
1055
  return value;
1056
1056
  };
1057
1057
  var _hasStarted, _startupTasks;
@@ -1122,7 +1122,7 @@ var __accessCheck$a = (obj, member, msg) => {
1122
1122
  };
1123
1123
  var __privateGet$8 = (obj, member, getter) => {
1124
1124
  __accessCheck$a(obj, member, "read from private field");
1125
- return getter ? getter.call(obj) : member.get(obj);
1125
+ return member.get(obj);
1126
1126
  };
1127
1127
  var __privateAdd$a = (obj, member, value) => {
1128
1128
  if (member.has(obj))
@@ -1131,7 +1131,7 @@ var __privateAdd$a = (obj, member, value) => {
1131
1131
  };
1132
1132
  var __privateSet$6 = (obj, member, value, setter) => {
1133
1133
  __accessCheck$a(obj, member, "write to private field");
1134
- setter ? setter.call(obj, value) : member.set(obj, value);
1134
+ member.set(obj, value);
1135
1135
  return value;
1136
1136
  };
1137
1137
  var __privateMethod$7 = (obj, member, method) => {
@@ -1331,7 +1331,7 @@ var __accessCheck$9 = (obj, member, msg) => {
1331
1331
  };
1332
1332
  var __privateGet$7 = (obj, member, getter) => {
1333
1333
  __accessCheck$9(obj, member, "read from private field");
1334
- return getter ? getter.call(obj) : member.get(obj);
1334
+ return member.get(obj);
1335
1335
  };
1336
1336
  var __privateAdd$9 = (obj, member, value) => {
1337
1337
  if (member.has(obj))
@@ -1340,7 +1340,7 @@ var __privateAdd$9 = (obj, member, value) => {
1340
1340
  };
1341
1341
  var __privateSet$5 = (obj, member, value, setter) => {
1342
1342
  __accessCheck$9(obj, member, "write to private field");
1343
- setter ? setter.call(obj, value) : member.set(obj, value);
1343
+ member.set(obj, value);
1344
1344
  return value;
1345
1345
  };
1346
1346
  var __privateMethod$6 = (obj, member, method) => {
@@ -1570,7 +1570,7 @@ var __accessCheck$8 = (obj, member, msg) => {
1570
1570
  };
1571
1571
  var __privateGet$6 = (obj, member, getter) => {
1572
1572
  __accessCheck$8(obj, member, "read from private field");
1573
- return getter ? getter.call(obj) : member.get(obj);
1573
+ return member.get(obj);
1574
1574
  };
1575
1575
  var __privateAdd$8 = (obj, member, value) => {
1576
1576
  if (member.has(obj))
@@ -1579,7 +1579,7 @@ var __privateAdd$8 = (obj, member, value) => {
1579
1579
  };
1580
1580
  var __privateSet$4 = (obj, member, value, setter) => {
1581
1581
  __accessCheck$8(obj, member, "write to private field");
1582
- setter ? setter.call(obj, value) : member.set(obj, value);
1582
+ member.set(obj, value);
1583
1583
  return value;
1584
1584
  };
1585
1585
  var __privateMethod$5 = (obj, member, method) => {
@@ -1870,7 +1870,7 @@ var __accessCheck$7 = (obj, member, msg) => {
1870
1870
  };
1871
1871
  var __privateGet$5 = (obj, member, getter) => {
1872
1872
  __accessCheck$7(obj, member, "read from private field");
1873
- return getter ? getter.call(obj) : member.get(obj);
1873
+ return member.get(obj);
1874
1874
  };
1875
1875
  var __privateAdd$7 = (obj, member, value) => {
1876
1876
  if (member.has(obj))
@@ -1879,7 +1879,7 @@ var __privateAdd$7 = (obj, member, value) => {
1879
1879
  };
1880
1880
  var __privateSet$3 = (obj, member, value, setter) => {
1881
1881
  __accessCheck$7(obj, member, "write to private field");
1882
- setter ? setter.call(obj, value) : member.set(obj, value);
1882
+ member.set(obj, value);
1883
1883
  return value;
1884
1884
  };
1885
1885
  var _initializer;
@@ -2147,7 +2147,12 @@ class DefaultAuthService {
2147
2147
  targetPluginId
2148
2148
  });
2149
2149
  }
2150
- 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
+ });
2151
2156
  case "user": {
2152
2157
  const { token } = internalForward;
2153
2158
  if (!token) {
@@ -2205,7 +2210,7 @@ var __accessCheck$5 = (obj, member, msg) => {
2205
2210
  };
2206
2211
  var __privateGet$4 = (obj, member, getter) => {
2207
2212
  __accessCheck$5(obj, member, "read from private field");
2208
- return getter ? getter.call(obj) : member.get(obj);
2213
+ return member.get(obj);
2209
2214
  };
2210
2215
  var __privateAdd$5 = (obj, member, value) => {
2211
2216
  if (member.has(obj))
@@ -2214,7 +2219,7 @@ var __privateAdd$5 = (obj, member, value) => {
2214
2219
  };
2215
2220
  var __privateSet$2 = (obj, member, value, setter) => {
2216
2221
  __accessCheck$5(obj, member, "write to private field");
2217
- setter ? setter.call(obj, value) : member.set(obj, value);
2222
+ member.set(obj, value);
2218
2223
  return value;
2219
2224
  };
2220
2225
  var _keyStore, _keyStoreUpdated;
@@ -2292,7 +2297,7 @@ class PluginTokenHandler {
2292
2297
  options.logger,
2293
2298
  options.ownPluginId,
2294
2299
  options.publicKeyStore,
2295
- options.keyDurationSeconds,
2300
+ Math.round(types.durationToMilliseconds(options.keyDuration) / 1e3),
2296
2301
  (_a = options.algorithm) != null ? _a : "ES256",
2297
2302
  options.discovery
2298
2303
  );
@@ -2462,18 +2467,16 @@ var __privateMethod$3 = (obj, member, method) => {
2462
2467
  };
2463
2468
  var _getTokenVerificationOptions, getTokenVerificationOptions_fn;
2464
2469
  const _UserTokenHandler = class _UserTokenHandler {
2465
- constructor(algorithms, jwksClient) {
2466
- this.algorithms = algorithms;
2470
+ constructor(jwksClient) {
2467
2471
  this.jwksClient = jwksClient;
2468
2472
  __privateAdd$4(this, _getTokenVerificationOptions);
2469
2473
  }
2470
2474
  static create(options) {
2471
- const algorithms = ["ES256"];
2472
2475
  const jwksClient = new JwksClient(async () => {
2473
2476
  const url = await options.discovery.getBaseUrl("auth");
2474
2477
  return new URL(`${url}/.well-known/jwks.json`);
2475
2478
  });
2476
- return new _UserTokenHandler(algorithms, jwksClient);
2479
+ return new _UserTokenHandler(jwksClient);
2477
2480
  }
2478
2481
  async verifyToken(token) {
2479
2482
  const verifyOpts = __privateMethod$3(this, _getTokenVerificationOptions, getTokenVerificationOptions_fn).call(this, token);
@@ -2546,14 +2549,12 @@ getTokenVerificationOptions_fn = function(token) {
2546
2549
  const { typ } = jose.decodeProtectedHeader(token);
2547
2550
  if (typ === pluginAuthNode.tokenTypes.user.typParam) {
2548
2551
  return {
2549
- algorithms: this.algorithms,
2550
2552
  requiredClaims: ["iat", "exp", "sub"],
2551
2553
  typ: pluginAuthNode.tokenTypes.user.typParam
2552
2554
  };
2553
2555
  }
2554
2556
  if (typ === pluginAuthNode.tokenTypes.limitedUser.typParam) {
2555
2557
  return {
2556
- algorithms: this.algorithms,
2557
2558
  requiredClaims: ["iat", "exp", "sub"],
2558
2559
  typ: pluginAuthNode.tokenTypes.limitedUser.typParam
2559
2560
  };
@@ -2561,7 +2562,6 @@ getTokenVerificationOptions_fn = function(token) {
2561
2562
  const { aud } = jose.decodeJwt(token);
2562
2563
  if (aud === pluginAuthNode.tokenTypes.user.audClaim) {
2563
2564
  return {
2564
- algorithms: this.algorithms,
2565
2565
  audience: pluginAuthNode.tokenTypes.user.audClaim
2566
2566
  };
2567
2567
  }
@@ -2577,7 +2577,7 @@ var __accessCheck$3 = (obj, member, msg) => {
2577
2577
  };
2578
2578
  var __privateGet$3 = (obj, member, getter) => {
2579
2579
  __accessCheck$3(obj, member, "read from private field");
2580
- return getter ? getter.call(obj) : member.get(obj);
2580
+ return member.get(obj);
2581
2581
  };
2582
2582
  var __privateAdd$3 = (obj, member, value) => {
2583
2583
  if (member.has(obj))
@@ -2651,7 +2651,7 @@ var __accessCheck$2 = (obj, member, msg) => {
2651
2651
  };
2652
2652
  var __privateGet$2 = (obj, member, getter) => {
2653
2653
  __accessCheck$2(obj, member, "read from private field");
2654
- return getter ? getter.call(obj) : member.get(obj);
2654
+ return member.get(obj);
2655
2655
  };
2656
2656
  var __privateAdd$2 = (obj, member, value) => {
2657
2657
  if (member.has(obj))
@@ -2753,7 +2753,16 @@ const authServiceFactory = backendPluginApi.createServiceFactory({
2753
2753
  // new auth services in the new backend system.
2754
2754
  tokenManager: backendPluginApi.coreServices.tokenManager
2755
2755
  },
2756
- async factory({ config, discovery, plugin, tokenManager, logger, database }) {
2756
+ async createRootContext({ config, logger }) {
2757
+ const externalTokens = ExternalTokenHandler.create({
2758
+ config,
2759
+ logger
2760
+ });
2761
+ return {
2762
+ externalTokens
2763
+ };
2764
+ },
2765
+ async factory({ config, discovery, plugin, tokenManager, logger, database }, { externalTokens }) {
2757
2766
  const disableDefaultAuthPolicy = Boolean(
2758
2767
  config.getOptionalBoolean(
2759
2768
  "backend.auth.dangerouslyDisableDefaultAuthPolicy"
@@ -2768,15 +2777,11 @@ const authServiceFactory = backendPluginApi.createServiceFactory({
2768
2777
  });
2769
2778
  const pluginTokens = PluginTokenHandler.create({
2770
2779
  ownPluginId: plugin.getId(),
2771
- keyDurationSeconds: 60 * 60,
2780
+ keyDuration: { hours: 1 },
2772
2781
  logger,
2773
2782
  publicKeyStore,
2774
2783
  discovery
2775
2784
  });
2776
- const externalTokens = ExternalTokenHandler.create({
2777
- config,
2778
- logger
2779
- });
2780
2785
  return new DefaultAuthService(
2781
2786
  userTokens,
2782
2787
  pluginTokens,
@@ -2940,7 +2945,7 @@ var __accessCheck$1 = (obj, member, msg) => {
2940
2945
  };
2941
2946
  var __privateGet$1 = (obj, member, getter) => {
2942
2947
  __accessCheck$1(obj, member, "read from private field");
2943
- return getter ? getter.call(obj) : member.get(obj);
2948
+ return member.get(obj);
2944
2949
  };
2945
2950
  var __privateAdd$1 = (obj, member, value) => {
2946
2951
  if (member.has(obj))
@@ -2949,7 +2954,7 @@ var __privateAdd$1 = (obj, member, value) => {
2949
2954
  };
2950
2955
  var __privateSet$1 = (obj, member, value, setter) => {
2951
2956
  __accessCheck$1(obj, member, "write to private field");
2952
- setter ? setter.call(obj, value) : member.set(obj, value);
2957
+ member.set(obj, value);
2953
2958
  return value;
2954
2959
  };
2955
2960
  var __privateMethod$1 = (obj, member, method) => {
@@ -3381,7 +3386,7 @@ var __accessCheck = (obj, member, msg) => {
3381
3386
  };
3382
3387
  var __privateGet = (obj, member, getter) => {
3383
3388
  __accessCheck(obj, member, "read from private field");
3384
- return getter ? getter.call(obj) : member.get(obj);
3389
+ return member.get(obj);
3385
3390
  };
3386
3391
  var __privateAdd = (obj, member, value) => {
3387
3392
  if (member.has(obj))
@@ -3390,7 +3395,7 @@ var __privateAdd = (obj, member, value) => {
3390
3395
  };
3391
3396
  var __privateSet = (obj, member, value, setter) => {
3392
3397
  __accessCheck(obj, member, "write to private field");
3393
- setter ? setter.call(obj, value) : member.set(obj, value);
3398
+ member.set(obj, value);
3394
3399
  return value;
3395
3400
  };
3396
3401
  var __privateMethod = (obj, member, method) => {
@@ -3472,15 +3477,8 @@ findConflictingPath_fn = function(newPath) {
3472
3477
  };
3473
3478
  let DefaultRootHttpRouter = _DefaultRootHttpRouter;
3474
3479
 
3475
- function defaultConfigure(context) {
3476
- const { app, routes, middleware } = context;
3477
- app.use(middleware.helmet());
3478
- app.use(middleware.cors());
3479
- app.use(middleware.compression());
3480
- app.use(middleware.logging());
3481
- app.use(routes);
3482
- app.use(middleware.notFound());
3483
- app.use(middleware.error());
3480
+ function defaultConfigure({ applyDefaults }) {
3481
+ applyDefaults();
3484
3482
  }
3485
3483
  const rootHttpRouterServiceFactory = backendPluginApi.createServiceFactory(
3486
3484
  (options) => ({
@@ -3496,19 +3494,30 @@ const rootHttpRouterServiceFactory = backendPluginApi.createServiceFactory(
3496
3494
  const app = express__default.default();
3497
3495
  const router = DefaultRootHttpRouter.create({ indexPath });
3498
3496
  const middleware = MiddlewareFactory.create({ config, logger });
3497
+ const routes = router.handler();
3498
+ const server = await createHttpServer(
3499
+ app,
3500
+ readHttpServerOptions(config.getOptionalConfig("backend")),
3501
+ { logger }
3502
+ );
3499
3503
  configure({
3500
3504
  app,
3501
- routes: router.handler(),
3505
+ server,
3506
+ routes,
3502
3507
  middleware,
3503
3508
  config,
3504
3509
  logger,
3505
- lifecycle
3510
+ lifecycle,
3511
+ applyDefaults() {
3512
+ app.use(middleware.helmet());
3513
+ app.use(middleware.cors());
3514
+ app.use(middleware.compression());
3515
+ app.use(middleware.logging());
3516
+ app.use(routes);
3517
+ app.use(middleware.notFound());
3518
+ app.use(middleware.error());
3519
+ }
3506
3520
  });
3507
- const server = await createHttpServer(
3508
- app,
3509
- readHttpServerOptions(config.getOptionalConfig("backend")),
3510
- { logger }
3511
- );
3512
3521
  lifecycle.addShutdownHook(() => server.stop());
3513
3522
  await server.start();
3514
3523
  return router;
@@ -3562,7 +3571,8 @@ const tokenManagerServiceFactory = backendPluginApi.createServiceFactory({
3562
3571
  },
3563
3572
  createRootContext({ config, logger }) {
3564
3573
  return backendCommon.ServerTokenManager.fromConfig(config, {
3565
- logger
3574
+ logger,
3575
+ allowDisabledTokenManager: true
3566
3576
  });
3567
3577
  },
3568
3578
  async factory(_deps, tokenManager) {