Skip to content

Commit 860de10

Browse files
committed
feat: including authentication to server applications in scaffolder plugin
Signed-off-by: Lucas Pires <lucas.tulio@grupoboticario.com.br>
1 parent 7da1e89 commit 860de10

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@backstage/plugin-scaffolder-backend': patch
3+
---
4+
5+
Make identity valid if subject of token is a github-server token

packages/backend/src/plugins/scaffolder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@ export default async function createPlugin(
3434
reader: env.reader,
3535
identity: env.identity,
3636
scheduler: env.scheduler,
37+
tokenManager: env.tokenManager,
3738
});
3839
}

plugins/scaffolder-backend/src/ScaffolderPlugin.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export const scaffolderPlugin = createBackendPlugin(
8282
database: coreServices.database,
8383
httpRouter: coreServices.httpRouter,
8484
catalogClient: catalogServiceRef,
85+
tokenManager: coreServices.tokenManager,
8586
},
8687
async init({
8788
logger,
@@ -90,6 +91,7 @@ export const scaffolderPlugin = createBackendPlugin(
9091
database,
9192
httpRouter,
9293
catalogClient,
94+
tokenManager,
9395
}) {
9496
const {
9597
additionalTemplateFilters,
@@ -127,6 +129,7 @@ export const scaffolderPlugin = createBackendPlugin(
127129
taskWorkers,
128130
additionalTemplateFilters,
129131
additionalTemplateGlobals,
132+
tokenManager,
130133
});
131134
httpRouter.use(router);
132135
},

plugins/scaffolder-backend/src/service/router.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { PluginDatabaseManager, UrlReader } from '@backstage/backend-common';
17+
import {
18+
PluginDatabaseManager,
19+
TokenManager,
20+
UrlReader,
21+
} from '@backstage/backend-common';
1822
import { PluginTaskScheduler } from '@backstage/backend-tasks';
1923
import { CatalogApi } from '@backstage/catalog-client';
2024
import {
@@ -82,6 +86,7 @@ export interface RouterOptions {
8286
additionalTemplateFilters?: Record<string, TemplateFilter>;
8387
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
8488
identity?: IdentityApi;
89+
tokenManager?: TokenManager;
8590
}
8691

8792
function isSupportedTemplate(entity: TemplateEntityV1beta3) {
@@ -96,13 +101,14 @@ function isSupportedTemplate(entity: TemplateEntityV1beta3) {
96101
* are using the IdentityApi, we can remove this function.
97102
*/
98103
function buildDefaultIdentityClient({
99-
logger,
104+
options,
100105
}: {
101-
logger: Logger;
106+
options: RouterOptions;
102107
}): IdentityApi {
103108
return {
104109
getIdentity: async ({ request }: IdentityApiGetIdentityRequest) => {
105110
const header = request.headers.authorization;
111+
const { logger, tokenManager } = options;
106112

107113
if (!header) {
108114
return undefined;
@@ -132,8 +138,15 @@ function buildDefaultIdentityClient({
132138
throw new TypeError('Expected string sub claim');
133139
}
134140

135-
// Check that it's a valid ref, otherwise this will throw.
136-
parseEntityRef(sub);
141+
try {
142+
// Check that it's a valid ref, otherwise this will throw.
143+
parseEntityRef(sub);
144+
} catch (e) {
145+
if (sub !== 'backstage-server' || !options.tokenManager) {
146+
throw e;
147+
}
148+
await tokenManager?.authenticate(token);
149+
}
137150

138151
return {
139152
identity: {
@@ -179,8 +192,7 @@ export async function createRouter(
179192
const logger = parentLogger.child({ plugin: 'scaffolder' });
180193

181194
const identity: IdentityApi =
182-
options.identity || buildDefaultIdentityClient({ logger });
183-
195+
options.identity || buildDefaultIdentityClient({ options });
184196
const workingDirectory = await getWorkingDirectory(config, logger);
185197
const integrations = ScmIntegrations.fromConfig(config);
186198

0 commit comments

Comments
 (0)