Skip to content

Commit

Permalink
feat(core-api): jwt authorization #770
Browse files Browse the repository at this point in the history
Primary change(s):
------------------

1. Verification of JSON web tokens for all endpoints by default.
2. The ability for endpoints to control on top of JWT valdity
the requirement of the JWT payload containing a certain scope

Miscellaneous change(s):
------------------------

1. Refactor of all the endpoints and plugins to make this change
technically possible.

Fixes #770

Signed-off-by: Peter Somogyvari <peter.somogyvari@accenture.com>
  • Loading branch information
petermetz committed Apr 21, 2021
1 parent 48d67a7 commit 2016750
Show file tree
Hide file tree
Showing 74 changed files with 6,490 additions and 146 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export class SupplyChainCactusPlugin

async registerWebServices(app: Express): Promise<IWebServiceEndpoint[]> {
const webServices = await this.getOrCreateWebServices();
webServices.forEach((ws) => ws.registerExpress(app));
await Promise.all(webServices.map((ws) => ws.registerExpress(app)));
return webServices;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,19 @@ import {
Checks,
LogLevelDesc,
LoggerProvider,
IAsyncProvider,
} from "@hyperledger/cactus-common";
import {
IEndpointAuthzOptions,
IExpressRequestHandler,
IWebServiceEndpoint,
} from "@hyperledger/cactus-core-api";
import { registerWebServiceEndpoint } from "@hyperledger/cactus-core";

import {
AuthorizationOptionsProvider,
registerWebServiceEndpoint,
} from "@hyperledger/cactus-core";

import {
DefaultApi as QuorumApi,
EthContractInvocationType,
Expand All @@ -27,8 +34,14 @@ export interface IInsertBambooHarvestEndpointOptions {
apiClient: QuorumApi;
web3SigningCredential: Web3SigningCredential;
keychainId: string;
authorizationOptionsProvider?: AuthorizationOptionsProvider;
}

const K_DEFAULT_AUTHORIZATION_OPTIONS: IEndpointAuthzOptions = {
isProtected: true,
requiredRoles: [],
};

export class InsertBambooHarvestEndpoint implements IWebServiceEndpoint {
public static readonly HTTP_PATH = Constants.HTTP_PATH;

Expand All @@ -39,6 +52,7 @@ export class InsertBambooHarvestEndpoint implements IWebServiceEndpoint {
public static readonly CLASS_NAME = "InsertBambooHarvestEndpoint";

private readonly log: Logger;
private readonly authorizationOptionsProvider: AuthorizationOptionsProvider;

public get className(): string {
return InsertBambooHarvestEndpoint.CLASS_NAME;
Expand All @@ -58,10 +72,22 @@ export class InsertBambooHarvestEndpoint implements IWebServiceEndpoint {
const level = this.opts.logLevel || "INFO";
const label = this.className;
this.log = LoggerProvider.getOrCreate({ level, label });

this.authorizationOptionsProvider =
opts.authorizationOptionsProvider ||
AuthorizationOptionsProvider.of(K_DEFAULT_AUTHORIZATION_OPTIONS, level);

this.log.debug(`Instantiated ${this.className} OK`);
}

getAuthorizationOptionsProvider(): IAsyncProvider<IEndpointAuthzOptions> {
return this.authorizationOptionsProvider;
}

public registerExpress(expressApp: Express): IWebServiceEndpoint {
registerWebServiceEndpoint(expressApp, this);
public async registerExpress(
expressApp: Express,
): Promise<IWebServiceEndpoint> {
await registerWebServiceEndpoint(expressApp, this);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import {
Checks,
LogLevelDesc,
LoggerProvider,
IAsyncProvider,
} from "@hyperledger/cactus-common";
import {
IEndpointAuthzOptions,
IExpressRequestHandler,
IWebServiceEndpoint,
} from "@hyperledger/cactus-core-api";
Expand Down Expand Up @@ -61,8 +63,20 @@ export class InsertBookshelfEndpoint implements IWebServiceEndpoint {
this.log = LoggerProvider.getOrCreate({ level, label });
}

public registerExpress(expressApp: Express): IWebServiceEndpoint {
registerWebServiceEndpoint(expressApp, this);
getAuthorizationOptionsProvider(): IAsyncProvider<IEndpointAuthzOptions> {
// TODO: make this an injectable dependency in the constructor
return {
get: async () => ({
isProtected: true,
requiredRoles: [],
}),
};
}

public async registerExpress(
expressApp: Express,
): Promise<IWebServiceEndpoint> {
await registerWebServiceEndpoint(expressApp, this);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import {
Checks,
LogLevelDesc,
LoggerProvider,
IAsyncProvider,
} from "@hyperledger/cactus-common";
import {
IEndpointAuthzOptions,
IExpressRequestHandler,
IWebServiceEndpoint,
} from "@hyperledger/cactus-core-api";
Expand Down Expand Up @@ -42,8 +44,20 @@ export class InsertShipmentEndpoint implements IWebServiceEndpoint {
this.log = LoggerProvider.getOrCreate({ level, label });
}

public registerExpress(expressApp: Express): IWebServiceEndpoint {
registerWebServiceEndpoint(expressApp, this);
getAuthorizationOptionsProvider(): IAsyncProvider<IEndpointAuthzOptions> {
// TODO: make this an injectable dependency in the constructor
return {
get: async () => ({
isProtected: true,
requiredRoles: [],
}),
};
}

public async registerExpress(
expressApp: Express,
): Promise<IWebServiceEndpoint> {
await registerWebServiceEndpoint(expressApp, this);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import {
Checks,
LogLevelDesc,
LoggerProvider,
IAsyncProvider,
} from "@hyperledger/cactus-common";
import {
IEndpointAuthzOptions,
IExpressRequestHandler,
IWebServiceEndpoint,
} from "@hyperledger/cactus-core-api";
Expand Down Expand Up @@ -59,8 +61,20 @@ export class ListBambooHarvestEndpoint implements IWebServiceEndpoint {
this.log = LoggerProvider.getOrCreate({ level, label });
}

public registerExpress(expressApp: Express): IWebServiceEndpoint {
registerWebServiceEndpoint(expressApp, this);
getAuthorizationOptionsProvider(): IAsyncProvider<IEndpointAuthzOptions> {
// TODO: make this an injectable dependency in the constructor
return {
get: async () => ({
isProtected: true,
requiredRoles: [],
}),
};
}

public async registerExpress(
expressApp: Express,
): Promise<IWebServiceEndpoint> {
await registerWebServiceEndpoint(expressApp, this);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import {
Checks,
LogLevelDesc,
LoggerProvider,
IAsyncProvider,
} from "@hyperledger/cactus-common";
import {
IEndpointAuthzOptions,
IExpressRequestHandler,
IWebServiceEndpoint,
} from "@hyperledger/cactus-core-api";
Expand Down Expand Up @@ -57,8 +59,20 @@ export class ListBookshelfEndpoint implements IWebServiceEndpoint {
this.log = LoggerProvider.getOrCreate({ level, label });
}

public registerExpress(expressApp: Express): IWebServiceEndpoint {
registerWebServiceEndpoint(expressApp, this);
getAuthorizationOptionsProvider(): IAsyncProvider<IEndpointAuthzOptions> {
// TODO: make this an injectable dependency in the constructor
return {
get: async () => ({
isProtected: true,
requiredRoles: [],
}),
};
}

public async registerExpress(
expressApp: Express,
): Promise<IWebServiceEndpoint> {
await registerWebServiceEndpoint(expressApp, this);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import {
Checks,
LogLevelDesc,
LoggerProvider,
IAsyncProvider,
} from "@hyperledger/cactus-common";
import {
IEndpointAuthzOptions,
IExpressRequestHandler,
IWebServiceEndpoint,
} from "@hyperledger/cactus-core-api";
Expand Down Expand Up @@ -62,8 +64,20 @@ export class ListShipmentEndpoint implements IWebServiceEndpoint {
this.log = LoggerProvider.getOrCreate({ level, label });
}

public registerExpress(expressApp: Express): IWebServiceEndpoint {
registerWebServiceEndpoint(expressApp, this);
getAuthorizationOptionsProvider(): IAsyncProvider<IEndpointAuthzOptions> {
// TODO: make this an injectable dependency in the constructor
return {
get: async () => ({
isProtected: true,
requiredRoles: [],
}),
};
}

public async registerExpress(
expressApp: Express,
): Promise<IWebServiceEndpoint> {
await registerWebServiceEndpoint(expressApp, this);
return this;
}

Expand Down

0 comments on commit 2016750

Please sign in to comment.