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:
committed by
Nataliya Issayeva
parent
657a6a0b8e
commit
2a320c21b4
@@ -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}`;
|
||||
|
||||
@@ -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) =>
|
||||
|
||||
Reference in New Issue
Block a user