From 808153c0f78828ead4a09622f89b15407510155e Mon Sep 17 00:00:00 2001 From: ebarrios Date: Fri, 12 Feb 2021 16:18:30 +0100 Subject: [PATCH] Added GithubApp authentication to the scaffolder plugin --- packages/integration/src/github/config.ts | 7 ++++ .../src/scaffolder/stages/publish/github.ts | 38 +++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/integration/src/github/config.ts b/packages/integration/src/github/config.ts index 94ed00731e..4b80a9aa60 100644 --- a/packages/integration/src/github/config.ts +++ b/packages/integration/src/github/config.ts @@ -59,6 +59,13 @@ export type GitHubIntegrationConfig = { */ token?: string; + /** + * The accessType (oAuth|githubApp) to use for requests to this provider. + * + * If no user is specified, oAuth access is used. + */ + accessType?: string; + /** * The GitHub Apps configuration to use for requests to this provider. * diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts index 13aab7ff34..667764dc1e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts @@ -17,6 +17,7 @@ import { PublisherBase, PublisherOptions, PublisherResult } from './types'; import { initRepoAndPush } from './helpers'; import { GitHubIntegrationConfig } from '@backstage/integration'; +import { createAppAuth } from '@octokit/auth-app'; import parseGitUrl from 'git-url-parse'; import { Octokit } from '@octokit/rest'; import path from 'path'; @@ -28,8 +29,23 @@ export class GithubPublisher implements PublisherBase { config: GitHubIntegrationConfig, { repoVisibility }: { repoVisibility: RepoVisibilityOptions }, ) { + config.accessType = 'oAuth'; + if (!config.token) { - return undefined; + if (!config.apps) { + return undefined + } + const auth = createAppAuth({ + appId: config.apps[0].appId, + privateKey: config.apps[0].privateKey, + installationId: process.env.GITHUB_INSTALLATION_ID, + clientId: config.apps[0].clientId, + clientSecret: config.apps[0].clientSecret, + }); + const appAuthentication = await auth({ type: 'installation' }); + + config.token = appAuthentication.token; + config.accessType = 'githubApp' } const githubClient = new Octokit({ @@ -39,6 +55,7 @@ export class GithubPublisher implements PublisherBase { return new GithubPublisher({ token: config.token, + accessType: config.accessType, client: githubClient, repoVisibility, }); @@ -47,6 +64,7 @@ export class GithubPublisher implements PublisherBase { constructor( private readonly config: { token: string; + accessType: string; client: Octokit; repoVisibility: RepoVisibilityOptions; }, @@ -68,15 +86,27 @@ export class GithubPublisher implements PublisherBase { owner, }); - await initRepoAndPush({ + if (this.config.accessType === 'githubApp') { + await initRepoAndPush({ dir: path.join(workspacePath, 'result'), remoteUrl, auth: { - username: this.config.token, - password: 'x-oauth-basic', + username: 'x-access-token', + password: this.config.token, }, logger, }); + } else if (this.config.accessType === 'oAuth'){ + await initRepoAndPush({ + dir: path.join(workspacePath, 'result'), + remoteUrl, + auth: { + username: this.config.token, + password: 'x-oauth-basic', + }, + logger, + }); + } const catalogInfoUrl = remoteUrl.replace( /\.git$/,