Skip to content

Commit 07c88c4

Browse files
authored
Add database token authentication helpers for OpenOps Tables (#1659)
Part of OPS-3021.
1 parent 9b3ff93 commit 07c88c4

File tree

4 files changed

+66
-0
lines changed

4 files changed

+66
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ServerContext } from '@openops/blocks-framework';
2+
import { AppSystemProp, encryptUtils, system } from '@openops/server-shared';
3+
import { authenticateDefaultUserInOpenOpsTables } from './auth-user';
4+
5+
export function shouldUseDatabaseToken(): boolean {
6+
return system.getBoolean(AppSystemProp.ENABLE_TABLES_DATABASE_TOKEN) ?? false;
7+
}
8+
9+
export type TokenOrResolver = string | { getToken: () => string };
10+
export type TablesServerContext = Pick<
11+
ServerContext,
12+
'tablesDatabaseId' | 'tablesDatabaseToken'
13+
>;
14+
15+
export async function resolveTokenProvider(
16+
serverContext: TablesServerContext,
17+
): Promise<TokenOrResolver> {
18+
if (shouldUseDatabaseToken()) {
19+
return {
20+
getToken: () => {
21+
const { tablesDatabaseToken } = serverContext;
22+
return encryptUtils.decryptString(tablesDatabaseToken);
23+
},
24+
};
25+
}
26+
27+
const { token } = await authenticateDefaultUserInOpenOpsTables();
28+
return token;
29+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { AxiosHeaders } from 'axios';
2+
import { shouldUseDatabaseToken, TokenOrResolver } from './context-helpers';
3+
4+
export enum AuthType {
5+
JWT = 'JWT',
6+
Token = 'Token',
7+
}
8+
9+
function getToken(tokenOrResolver: TokenOrResolver): string {
10+
return typeof tokenOrResolver === 'string'
11+
? tokenOrResolver
12+
: tokenOrResolver.getToken();
13+
}
14+
15+
function getAuthPrefix(
16+
useJwtOverride: boolean,
17+
shouldUseDatabaseTokenConfig: boolean,
18+
): AuthType {
19+
const useJwt = useJwtOverride || !shouldUseDatabaseTokenConfig;
20+
return useJwt ? AuthType.JWT : AuthType.Token;
21+
}
22+
23+
export const createAxiosHeaders = (
24+
tokenOrResolver: TokenOrResolver,
25+
): AxiosHeaders => {
26+
const useJwtOverride = typeof tokenOrResolver === 'string';
27+
const token = getToken(tokenOrResolver);
28+
29+
const prefix = getAuthPrefix(useJwtOverride, shouldUseDatabaseToken());
30+
31+
return new AxiosHeaders({
32+
'Content-Type': 'application/json',
33+
Authorization: `${prefix} ${token}`,
34+
});
35+
};

packages/server/shared/src/lib/system/system-prop.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ export enum AppSystemProp {
110110

111111
MAX_LLM_CALLS_WITHOUT_INTERACTION = 'MAX_LLM_CALLS_WITHOUT_INTERACTION',
112112
LLM_CHAT_EXPIRE_TIME_SECONDS = 'LLM_CHAT_EXPIRE_TIME_SECONDS',
113+
ENABLE_TABLES_DATABASE_TOKEN = 'ENABLE_TABLES_DATABASE_TOKEN',
113114
}
114115

115116
export enum SharedSystemProp {

packages/server/shared/src/lib/system/system.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ const systemPropDefaultValues: Partial<Record<SystemProp, string>> = {
9898
[AppSystemProp.LLM_CHAT_EXPIRE_TIME_SECONDS]: '86400', // 24 hours
9999
[AppSystemProp.TELEMETRY_MODE]: 'COLLECTOR',
100100
[AppSystemProp.TELEMETRY_COLLECTOR_URL]: 'https://telemetry.openops.com/save',
101+
[AppSystemProp.ENABLE_TABLES_DATABASE_TOKEN]: 'false',
101102
[SharedSystemProp.ENABLE_HOST_VALIDATION]: 'true',
102103
};
103104

0 commit comments

Comments
 (0)