Pass auth token from document collators

Co-authored-by: Nataliya Issayeva <nissayeva@users.noreply.github.com>
Co-authored-by: Tim Hansen <timbonicus@gmail.com>
Signed-off-by: Joe Porpeglia <josephp@spotify.com>
This commit is contained in:
Joe Porpeglia
2021-10-28 15:51:20 -04:00
committed by Nataliya Issayeva
parent 657a6a0b8e
commit 2a320c21b4
4 changed files with 50 additions and 20 deletions
+3 -1
View File
@@ -157,7 +157,9 @@ async function main() {
const token =
IdentityClient.getBearerToken(req.headers.authorization) ||
req.cookies.token;
req.user = await identity.authenticate(token);
await authEnv.tokenManager.validateToken(token);
if (!req.headers.authorization) {
// Authorization header may be forwarded by plugin requests
req.headers.authorization = `Bearer ${token}`;
+6 -1
View File
@@ -59,6 +59,7 @@ export default async function createPlugin({
discovery,
config,
database,
tokenManager,
}: PluginEnvironment) {
// Initialize a connection to a search engine.
const searchEngine = await createSearchEngine({ config, logger, database });
@@ -68,7 +69,10 @@ export default async function createPlugin({
// particular collator gathers entities from the software catalog.
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
collator: DefaultCatalogCollator.fromConfig(config, { discovery }),
collator: DefaultCatalogCollator.fromConfig(config, {
discovery,
tokenManager,
}),
});
indexBuilder.addCollator({
@@ -76,6 +80,7 @@ export default async function createPlugin({
collator: DefaultTechDocsCollator.fromConfig(config, {
discovery,
logger,
tokenManager,
}),
});
@@ -14,7 +14,10 @@
* limitations under the License.
*/
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import {
PluginEndpointDiscovery,
TokenManager,
} from '@backstage/backend-common';
import { Entity } from '@backstage/catalog-model';
import { IndexableDocument, DocumentCollator } from '@backstage/search-common';
import { Config } from '@backstage/config';
@@ -38,11 +41,13 @@ export class DefaultCatalogCollator implements DocumentCollator {
protected filter?: CatalogEntitiesRequest['filter'];
protected readonly catalogClient: CatalogApi;
public readonly type: string = 'software-catalog';
protected tokenManager: TokenManager;
static fromConfig(
_config: Config,
options: {
discovery: PluginEndpointDiscovery;
tokenManager: TokenManager;
filter?: CatalogEntitiesRequest['filter'];
},
) {
@@ -56,8 +61,10 @@ export class DefaultCatalogCollator implements DocumentCollator {
locationTemplate,
filter,
catalogClient,
tokenManager,
}: {
discovery: PluginEndpointDiscovery;
tokenManager: TokenManager;
locationTemplate?: string;
filter?: CatalogEntitiesRequest['filter'];
catalogClient?: CatalogApi;
@@ -68,6 +75,7 @@ export class DefaultCatalogCollator implements DocumentCollator {
this.filter = filter;
this.catalogClient =
catalogClient || new CatalogClient({ discoveryApi: discovery });
this.tokenManager = tokenManager;
}
protected applyArgsToFormat(
@@ -82,9 +90,13 @@ export class DefaultCatalogCollator implements DocumentCollator {
}
async execute() {
const response = await this.catalogClient.getEntities({
filter: this.filter,
});
const { token } = await this.tokenManager.getServerToken();
const response = await this.catalogClient.getEntities(
{
filter: this.filter,
},
{ token },
);
return response.items.map((entity: Entity): CatalogEntityDocument => {
return {
title: entity.metadata.title ?? entity.metadata.name,
@@ -14,7 +14,10 @@
* limitations under the License.
*/
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import {
PluginEndpointDiscovery,
TokenManager,
} from '@backstage/backend-common';
import { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model';
import { DocumentCollator } from '@backstage/search-common';
import fetch from 'cross-fetch';
@@ -34,6 +37,7 @@ interface MkSearchIndexDoc {
export type TechDocsCollatorOptions = {
discovery: PluginEndpointDiscovery;
logger: Logger;
tokenManager: TokenManager;
locationTemplate?: string;
catalogClient?: CatalogApi;
parallelismLimit?: number;
@@ -51,6 +55,7 @@ export class DefaultTechDocsCollator implements DocumentCollator {
protected locationTemplate: string;
private readonly logger: Logger;
private readonly catalogClient: CatalogApi;
private readonly tokenManager: TokenManager;
private readonly parallelismLimit: number;
private readonly legacyPathCasing: boolean;
public readonly type: string = 'techdocs';
@@ -63,6 +68,7 @@ export class DefaultTechDocsCollator implements DocumentCollator {
locationTemplate,
logger,
catalogClient,
tokenManager,
parallelismLimit = 10,
legacyPathCasing = false,
}: TechDocsCollatorOptions) {
@@ -74,6 +80,7 @@ export class DefaultTechDocsCollator implements DocumentCollator {
catalogClient || new CatalogClient({ discoveryApi: discovery });
this.parallelismLimit = parallelismLimit;
this.legacyPathCasing = legacyPathCasing;
this.tokenManager = tokenManager;
}
static fromConfig(config: Config, options: TechDocsCollatorOptions) {
@@ -87,19 +94,23 @@ export class DefaultTechDocsCollator implements DocumentCollator {
async execute() {
const limit = pLimit(this.parallelismLimit);
const techDocsBaseUrl = await this.discovery.getBaseUrl('techdocs');
const entities = await this.catalogClient.getEntities({
fields: [
'kind',
'namespace',
'metadata.annotations',
'metadata.name',
'metadata.title',
'metadata.namespace',
'spec.type',
'spec.lifecycle',
'relations',
],
});
const { token } = await this.tokenManager.getServerToken();
const entities = await this.catalogClient.getEntities(
{
fields: [
'kind',
'namespace',
'metadata.annotations',
'metadata.name',
'metadata.title',
'metadata.namespace',
'spec.type',
'spec.lifecycle',
'relations',
],
},
{ token },
);
const docPromises = entities.items
.filter(it => it.metadata?.annotations?.['backstage.io/techdocs-ref'])
.map((entity: Entity) =>