@vymalo/opencode-oauth2 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache.d.ts +14 -3
- package/dist/cache.js +32 -86
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +3 -37
- package/dist/config.js +39 -136
- package/dist/config.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/model-discovery.d.ts +2 -2
- package/dist/model-discovery.js +1 -1
- package/dist/opencode.d.ts +1 -1
- package/dist/opencode.js +1 -1
- package/dist/opencode.js.map +1 -1
- package/dist/plugin.d.ts +4 -2
- package/dist/plugin.js +62 -31
- package/dist/plugin.js.map +1 -1
- package/dist/scheduler.d.ts +1 -1
- package/dist/types.d.ts +1 -7
- package/package.json +3 -2
- package/dist/logging.d.ts +0 -13
- package/dist/logging.js +0 -64
- package/dist/logging.js.map +0 -1
- package/dist/oauth/browser.d.ts +0 -1
- package/dist/oauth/browser.js +0 -33
- package/dist/oauth/browser.js.map +0 -1
- package/dist/oauth/client.d.ts +0 -56
- package/dist/oauth/client.js +0 -424
- package/dist/oauth/client.js.map +0 -1
- package/dist/oauth/device-code.d.ts +0 -28
- package/dist/oauth/device-code.js +0 -247
- package/dist/oauth/device-code.js.map +0 -1
- package/dist/oauth/discovery.d.ts +0 -8
- package/dist/oauth/discovery.js +0 -38
- package/dist/oauth/discovery.js.map +0 -1
- package/dist/oauth/http-utils.d.ts +0 -33
- package/dist/oauth/http-utils.js +0 -118
- package/dist/oauth/http-utils.js.map +0 -1
- package/dist/oauth/local-callback.d.ts +0 -10
- package/dist/oauth/local-callback.js +0 -84
- package/dist/oauth/local-callback.js.map +0 -1
- package/dist/oauth/pkce.d.ts +0 -5
- package/dist/oauth/pkce.js +0 -17
- package/dist/oauth/pkce.js.map +0 -1
- package/dist/oauth/subject-token.d.ts +0 -20
- package/dist/oauth/subject-token.js +0 -81
- package/dist/oauth/subject-token.js.map +0 -1
package/dist/plugin.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { createJsonConsoleLogger, TokenRuntime } from "@vymalo/opencode-auth-core/lib";
|
|
1
2
|
import { FileCacheStore, resolveCacheDir } from "./cache.js";
|
|
2
3
|
import { validateConfig } from "./config.js";
|
|
3
|
-
import { createJsonConsoleLogger } from "./logging.js";
|
|
4
4
|
import { fetchModels } from "./model-discovery.js";
|
|
5
5
|
import { diffModels, normalizeModelList } from "./model-normalization.js";
|
|
6
|
-
import { OAuthClient } from "./oauth/client.js";
|
|
7
6
|
import { startScheduler } from "./scheduler.js";
|
|
8
7
|
export class OAuth2ModelSyncPlugin {
|
|
9
8
|
configInput;
|
|
@@ -21,6 +20,58 @@ export class OAuth2ModelSyncPlugin {
|
|
|
21
20
|
this.logger = options.logger ?? createJsonConsoleLogger(this.config.logLevel);
|
|
22
21
|
this.cacheStore = new FileCacheStore(options.cacheDir ?? resolveCacheDir(this.config.cacheNamespace), this.logger);
|
|
23
22
|
}
|
|
23
|
+
buildTokenRuntime(serverId) {
|
|
24
|
+
const server = this.requireServerConfig(serverId);
|
|
25
|
+
const runtime = this.runtimeByServer.get(serverId);
|
|
26
|
+
const authConfig = {
|
|
27
|
+
id: server.id,
|
|
28
|
+
issuer: server.issuer,
|
|
29
|
+
clientId: server.clientId,
|
|
30
|
+
clientSecret: server.clientSecret,
|
|
31
|
+
scopes: server.scopes,
|
|
32
|
+
authorizationEndpoint: server.authorizationEndpoint,
|
|
33
|
+
tokenEndpoint: server.tokenEndpoint,
|
|
34
|
+
deviceAuthorizationEndpoint: server.deviceAuthorizationEndpoint,
|
|
35
|
+
jwksUri: server.jwksUri,
|
|
36
|
+
redirectPort: server.redirectPort,
|
|
37
|
+
authFlow: server.authFlow,
|
|
38
|
+
pkce: server.pkce,
|
|
39
|
+
subjectTokenSource: server.subjectTokenSource,
|
|
40
|
+
tokenExchangeAudience: server.tokenExchangeAudience
|
|
41
|
+
};
|
|
42
|
+
return new TokenRuntime(server.id, authConfig, {
|
|
43
|
+
logger: this.logger,
|
|
44
|
+
fetchImpl: this.options.fetchImpl,
|
|
45
|
+
timeoutMs: this.config.httpTimeoutMs,
|
|
46
|
+
onAuthorizationUrl: this.options.onAuthorizationUrl,
|
|
47
|
+
tokenExpirySkewMs: this.config.tokenExpirySkewMs,
|
|
48
|
+
// Delegate the token cache to oauth2's fused CachedServerState so the
|
|
49
|
+
// on-disk location and shape are preserved (tests + existing installs).
|
|
50
|
+
getCached: async () => runtime?.state.token,
|
|
51
|
+
setCached: async (token) => {
|
|
52
|
+
if (!runtime) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const next = {
|
|
56
|
+
...runtime.state,
|
|
57
|
+
updatedAt: Date.now(),
|
|
58
|
+
token
|
|
59
|
+
};
|
|
60
|
+
await this.cacheStore.saveServerState(next);
|
|
61
|
+
runtime.state = next;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
ensureTokenRuntime(serverId) {
|
|
66
|
+
const runtime = this.runtimeByServer.get(serverId);
|
|
67
|
+
if (!runtime) {
|
|
68
|
+
throw new Error(`runtime not initialized for server: ${serverId}`);
|
|
69
|
+
}
|
|
70
|
+
if (!runtime.tokenRuntime) {
|
|
71
|
+
runtime.tokenRuntime = this.buildTokenRuntime(serverId);
|
|
72
|
+
}
|
|
73
|
+
return runtime.tokenRuntime;
|
|
74
|
+
}
|
|
24
75
|
async initialize() {
|
|
25
76
|
if (this.initialized) {
|
|
26
77
|
return;
|
|
@@ -107,7 +158,6 @@ export class OAuth2ModelSyncPlugin {
|
|
|
107
158
|
return snapshots;
|
|
108
159
|
}
|
|
109
160
|
async syncServer(serverId, options = {}) {
|
|
110
|
-
const server = this.requireServerConfig(serverId);
|
|
111
161
|
const runtime = this.runtimeByServer.get(serverId);
|
|
112
162
|
if (!runtime) {
|
|
113
163
|
throw new Error(`runtime not initialized for server: ${serverId}`);
|
|
@@ -116,13 +166,7 @@ export class OAuth2ModelSyncPlugin {
|
|
|
116
166
|
serverId,
|
|
117
167
|
interactive: options.interactive !== false
|
|
118
168
|
});
|
|
119
|
-
const
|
|
120
|
-
fetchImpl: this.options.fetchImpl,
|
|
121
|
-
logger: this.logger,
|
|
122
|
-
timeoutMs: this.config.httpTimeoutMs,
|
|
123
|
-
onAuthorizationUrl: this.options.onAuthorizationUrl,
|
|
124
|
-
tokenExpirySkewMs: this.config.tokenExpirySkewMs
|
|
125
|
-
});
|
|
169
|
+
const tokenRuntime = this.ensureTokenRuntime(serverId);
|
|
126
170
|
const previousState = runtime.state;
|
|
127
171
|
try {
|
|
128
172
|
this.logger.trace("oauth2_sync_ensure_token", {
|
|
@@ -131,13 +175,13 @@ export class OAuth2ModelSyncPlugin {
|
|
|
131
175
|
hadRefreshToken: Boolean(previousState.token?.refreshToken),
|
|
132
176
|
interactive: options.interactive !== false
|
|
133
177
|
});
|
|
134
|
-
const token = await
|
|
178
|
+
const token = await tokenRuntime.ensure({ interactive: options.interactive });
|
|
135
179
|
this.logger.trace("oauth2_model_discovery_fetch_start", {
|
|
136
180
|
serverId,
|
|
137
|
-
baseURL:
|
|
181
|
+
baseURL: this.requireServerConfig(serverId).baseURL,
|
|
138
182
|
tokenChanged: token.accessToken !== previousState.token?.accessToken
|
|
139
183
|
});
|
|
140
|
-
const rawModels = await fetchModels(
|
|
184
|
+
const rawModels = await fetchModels(this.requireServerConfig(serverId).baseURL, token, {
|
|
141
185
|
fetchImpl: this.options.fetchImpl,
|
|
142
186
|
timeoutMs: this.config.httpTimeoutMs,
|
|
143
187
|
logger: this.logger
|
|
@@ -146,7 +190,7 @@ export class OAuth2ModelSyncPlugin {
|
|
|
146
190
|
serverId,
|
|
147
191
|
rawModelCount: rawModels.length
|
|
148
192
|
});
|
|
149
|
-
const normalizedModels = normalizeModelList(rawModels,
|
|
193
|
+
const normalizedModels = normalizeModelList(rawModels, this.requireServerConfig(serverId).nameOverrides);
|
|
150
194
|
const diff = diffModels(previousState.models, normalizedModels);
|
|
151
195
|
this.logger.trace("oauth2_model_discovery_normalized", {
|
|
152
196
|
serverId,
|
|
@@ -195,18 +239,11 @@ export class OAuth2ModelSyncPlugin {
|
|
|
195
239
|
}
|
|
196
240
|
}
|
|
197
241
|
async ensureAccessToken(serverId, options = {}) {
|
|
198
|
-
const server = this.requireServerConfig(serverId);
|
|
199
242
|
const runtime = this.runtimeByServer.get(serverId);
|
|
200
243
|
if (!runtime) {
|
|
201
244
|
throw new Error(`runtime not initialized for server: ${serverId}`);
|
|
202
245
|
}
|
|
203
|
-
const
|
|
204
|
-
fetchImpl: this.options.fetchImpl,
|
|
205
|
-
logger: this.logger,
|
|
206
|
-
timeoutMs: this.config.httpTimeoutMs,
|
|
207
|
-
onAuthorizationUrl: this.options.onAuthorizationUrl,
|
|
208
|
-
tokenExpirySkewMs: this.config.tokenExpirySkewMs
|
|
209
|
-
});
|
|
246
|
+
const tokenRuntime = this.ensureTokenRuntime(serverId);
|
|
210
247
|
// `interactive` is forwarded so config-time callers can ask for a
|
|
211
248
|
// refresh-only ensure (`interactive: false`): a valid cached token is
|
|
212
249
|
// returned as-is, a stale-but-refreshable one is refreshed, and anything
|
|
@@ -218,20 +255,14 @@ export class OAuth2ModelSyncPlugin {
|
|
|
218
255
|
hadRefreshToken: Boolean(runtime.state.token?.refreshToken),
|
|
219
256
|
interactive: options.interactive !== false
|
|
220
257
|
});
|
|
221
|
-
const
|
|
222
|
-
|
|
258
|
+
const previousToken = runtime.state.token;
|
|
259
|
+
const token = await tokenRuntime.ensure({ interactive: options.interactive });
|
|
260
|
+
if (token.accessToken !== previousToken?.accessToken) {
|
|
223
261
|
this.logger.trace("oauth2_ensure_access_token_refreshed", {
|
|
224
262
|
serverId,
|
|
225
263
|
present: Boolean(token.accessToken),
|
|
226
264
|
expiresInSeconds: typeof token.expiresAt === "number" ? Math.max(0, Math.round((token.expiresAt - Date.now()) / 1e3)) : undefined
|
|
227
265
|
});
|
|
228
|
-
const nextState = {
|
|
229
|
-
...runtime.state,
|
|
230
|
-
updatedAt: Date.now(),
|
|
231
|
-
token
|
|
232
|
-
};
|
|
233
|
-
await this.cacheStore.saveServerState(nextState);
|
|
234
|
-
runtime.state = nextState;
|
|
235
266
|
} else {
|
|
236
267
|
this.logger.trace("oauth2_ensure_access_token_reused_cached", {
|
|
237
268
|
serverId,
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAAA,SAAS,gBAAgB,uBAAuB;AAChD,SAA0C,sBAAsB;AAChE,SAAS
|
|
1
|
+
{"mappings":"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","names":[],"sources":["../src/plugin.ts"],"version":3,"file":"plugin.js","sourceRoot":""}
|
package/dist/scheduler.d.ts
CHANGED
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TokenSet } from "@vymalo/opencode-auth-core/lib";
|
|
1
2
|
export interface RawModel {
|
|
2
3
|
id: string;
|
|
3
4
|
[key: string]: unknown;
|
|
@@ -15,13 +16,6 @@ export interface ModelDiff {
|
|
|
15
16
|
after: string;
|
|
16
17
|
}>;
|
|
17
18
|
}
|
|
18
|
-
export interface TokenSet {
|
|
19
|
-
accessToken: string;
|
|
20
|
-
tokenType: string;
|
|
21
|
-
refreshToken?: string;
|
|
22
|
-
scope?: string;
|
|
23
|
-
expiresAt?: number;
|
|
24
|
-
}
|
|
25
19
|
export interface CachedServerState {
|
|
26
20
|
serverId: string;
|
|
27
21
|
updatedAt: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vymalo/opencode-oauth2",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "OpenCode plugin for OAuth2/OIDC-secured, OpenAI-compatible model providers with periodic model sync.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "vymalo contributors",
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@opencode-ai/plugin": "1.15.10"
|
|
50
|
+
"@opencode-ai/plugin": "1.15.10",
|
|
51
|
+
"@vymalo/opencode-auth-core": "0.15.0"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@ai-sdk/openai": "^2.0.106",
|
package/dist/logging.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type LogLevel = "trace" | "debug" | "info" | "warn" | "error";
|
|
2
|
-
export declare const LOG_LEVEL_PRIORITY: Record<LogLevel, number>;
|
|
3
|
-
export interface LogFields {
|
|
4
|
-
[key: string]: unknown;
|
|
5
|
-
}
|
|
6
|
-
export interface Logger {
|
|
7
|
-
trace(event: string, fields?: LogFields): void;
|
|
8
|
-
debug(event: string, fields?: LogFields): void;
|
|
9
|
-
info(event: string, fields?: LogFields): void;
|
|
10
|
-
warn(event: string, fields?: LogFields): void;
|
|
11
|
-
error(event: string, fields?: LogFields): void;
|
|
12
|
-
}
|
|
13
|
-
export declare function createJsonConsoleLogger(minLevel?: LogLevel): Logger;
|
package/dist/logging.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
export const LOG_LEVEL_PRIORITY = {
|
|
2
|
-
trace: 5,
|
|
3
|
-
debug: 10,
|
|
4
|
-
info: 20,
|
|
5
|
-
warn: 30,
|
|
6
|
-
error: 40
|
|
7
|
-
};
|
|
8
|
-
function redactFields(fields) {
|
|
9
|
-
if (!fields) {
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
const redacted = {};
|
|
13
|
-
for (const [key, value] of Object.entries(fields)) {
|
|
14
|
-
if (/token|secret|password/i.test(key)) {
|
|
15
|
-
redacted[key] = "[redacted]";
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
redacted[key] = value;
|
|
19
|
-
}
|
|
20
|
-
return redacted;
|
|
21
|
-
}
|
|
22
|
-
export function createJsonConsoleLogger(minLevel = "info") {
|
|
23
|
-
const minPriority = LOG_LEVEL_PRIORITY[minLevel];
|
|
24
|
-
const log = (level, event, fields) => {
|
|
25
|
-
if (LOG_LEVEL_PRIORITY[level] < minPriority) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const payload = {
|
|
29
|
-
ts: new Date().toISOString(),
|
|
30
|
-
level,
|
|
31
|
-
event,
|
|
32
|
-
...redactFields(fields) ?? {}
|
|
33
|
-
};
|
|
34
|
-
const line = JSON.stringify(payload);
|
|
35
|
-
if (level === "error") {
|
|
36
|
-
console.error(line);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
if (level === "warn") {
|
|
40
|
-
console.warn(line);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
console.log(line);
|
|
44
|
-
};
|
|
45
|
-
return {
|
|
46
|
-
trace(event, fields) {
|
|
47
|
-
log("trace", event, fields);
|
|
48
|
-
},
|
|
49
|
-
debug(event, fields) {
|
|
50
|
-
log("debug", event, fields);
|
|
51
|
-
},
|
|
52
|
-
info(event, fields) {
|
|
53
|
-
log("info", event, fields);
|
|
54
|
-
},
|
|
55
|
-
warn(event, fields) {
|
|
56
|
-
log("warn", event, fields);
|
|
57
|
-
},
|
|
58
|
-
error(event, fields) {
|
|
59
|
-
log("error", event, fields);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
//# sourceMappingURL=logging.js.map
|
package/dist/logging.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":"AAEA,OAAO,MAAM,qBAA+C;CAC1D,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;AACT;AAcA,SAAS,aAAa,QAA2C;CAC/D,IAAI,CAAC,QAAQ;EACX,OAAO;CACT;CAEA,MAAM,WAAsB,CAAC;CAC7B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,yBAAyB,KAAK,GAAG,GAAG;GACtC,SAAS,OAAO;GAChB;EACF;EACA,SAAS,OAAO;CAClB;CAEA,OAAO;AACT;AAEA,OAAO,SAAS,wBAAwB,WAAqB,QAAgB;CAC3E,MAAM,cAAc,mBAAmB;CAEvC,MAAM,OAAO,OAAiB,OAAe,WAA6B;EACxE,IAAI,mBAAmB,SAAS,aAAa;GAC3C;EACF;EAEA,MAAM,UAAU;GACd,IAAI,IAAI,KAAK,CAAC,CAAC,YAAY;GAC3B;GACA;GACA,GAAI,aAAa,MAAM,KAAK,CAAC;EAC/B;EAEA,MAAM,OAAO,KAAK,UAAU,OAAO;EACnC,IAAI,UAAU,SAAS;GACrB,QAAQ,MAAM,IAAI;GAClB;EACF;EAEA,IAAI,UAAU,QAAQ;GACpB,QAAQ,KAAK,IAAI;GACjB;EACF;EAEA,QAAQ,IAAI,IAAI;CAClB;CAEA,OAAO;EACL,MAAM,OAAO,QAAQ;GACnB,IAAI,SAAS,OAAO,MAAM;EAC5B;EACA,MAAM,OAAO,QAAQ;GACnB,IAAI,SAAS,OAAO,MAAM;EAC5B;EACA,KAAK,OAAO,QAAQ;GAClB,IAAI,QAAQ,OAAO,MAAM;EAC3B;EACA,KAAK,OAAO,QAAQ;GAClB,IAAI,QAAQ,OAAO,MAAM;EAC3B;EACA,MAAM,OAAO,QAAQ;GACnB,IAAI,SAAS,OAAO,MAAM;EAC5B;CACF;AACF","names":[],"sources":["../src/logging.ts"],"version":3,"file":"logging.js","sourceRoot":""}
|
package/dist/oauth/browser.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function openExternalUrl(url: string): Promise<void>;
|
package/dist/oauth/browser.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
export async function openExternalUrl(url) {
|
|
3
|
-
await new Promise((resolve, reject) => {
|
|
4
|
-
let command;
|
|
5
|
-
let args;
|
|
6
|
-
if (process.platform === "darwin") {
|
|
7
|
-
command = "open";
|
|
8
|
-
args = [url];
|
|
9
|
-
} else if (process.platform === "win32") {
|
|
10
|
-
command = "cmd";
|
|
11
|
-
args = [
|
|
12
|
-
"/c",
|
|
13
|
-
"start",
|
|
14
|
-
"",
|
|
15
|
-
url
|
|
16
|
-
];
|
|
17
|
-
} else {
|
|
18
|
-
command = "xdg-open";
|
|
19
|
-
args = [url];
|
|
20
|
-
}
|
|
21
|
-
const child = spawn(command, args, {
|
|
22
|
-
stdio: "ignore",
|
|
23
|
-
detached: true
|
|
24
|
-
});
|
|
25
|
-
child.once("error", reject);
|
|
26
|
-
child.once("spawn", () => {
|
|
27
|
-
child.unref();
|
|
28
|
-
resolve();
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":"AAAA,SAAS,aAAa;AAEtB,OAAO,eAAe,gBAAgB,KAA4B;CAChE,MAAM,IAAI,SAAe,SAAS,WAAW;EAC3C,IAAI;EACJ,IAAI;EAEJ,IAAI,QAAQ,aAAa,UAAU;GACjC,UAAU;GACV,OAAO,CAAC,GAAG;EACb,OAAO,IAAI,QAAQ,aAAa,SAAS;GACvC,UAAU;GACV,OAAO;IAAC;IAAM;IAAS;IAAI;GAAG;EAChC,OAAO;GACL,UAAU;GACV,OAAO,CAAC,GAAG;EACb;EAEA,MAAM,QAAQ,MAAM,SAAS,MAAM;GACjC,OAAO;GACP,UAAU;EACZ,CAAC;EAED,MAAM,KAAK,SAAS,MAAM;EAC1B,MAAM,KAAK,eAAe;GACxB,MAAM,MAAM;GACZ,QAAQ;EACV,CAAC;CACH,CAAC;AACH","names":[],"sources":["../../src/oauth/browser.ts"],"version":3,"file":"browser.js","sourceRoot":""}
|
package/dist/oauth/client.d.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import type { OAuthServerConfig } from "../config.js";
|
|
2
|
-
import type { Logger } from "../logging.js";
|
|
3
|
-
import type { TokenSet } from "../types.js";
|
|
4
|
-
interface OAuthClientOptions {
|
|
5
|
-
fetchImpl?: typeof fetch;
|
|
6
|
-
logger: Logger;
|
|
7
|
-
timeoutMs: number;
|
|
8
|
-
onAuthorizationUrl?: (url: string) => Promise<void> | void;
|
|
9
|
-
tokenExpirySkewMs?: number;
|
|
10
|
-
}
|
|
11
|
-
export declare function toTokenSet(payload: Record<string, unknown>, options?: {
|
|
12
|
-
fallbackRefreshToken?: string;
|
|
13
|
-
requireRefreshToken?: boolean;
|
|
14
|
-
}): TokenSet;
|
|
15
|
-
export declare class OAuthClient {
|
|
16
|
-
private readonly server;
|
|
17
|
-
private readonly fetchImpl;
|
|
18
|
-
private readonly logger;
|
|
19
|
-
private readonly timeoutMs;
|
|
20
|
-
private readonly onAuthorizationUrl?;
|
|
21
|
-
private readonly tokenExpirySkewMs;
|
|
22
|
-
constructor(server: OAuthServerConfig, options: OAuthClientOptions);
|
|
23
|
-
private isTokenValid;
|
|
24
|
-
/**
|
|
25
|
-
* POST to a token endpoint with an AbortController-backed timeout. Without
|
|
26
|
-
* this, a stalled IdP would block the warmup path indefinitely (the plugin
|
|
27
|
-
* runs token requests at config-hook time for cached/client_credentials
|
|
28
|
-
* paths).
|
|
29
|
-
*/
|
|
30
|
-
private postWithTimeout;
|
|
31
|
-
ensureToken(current?: TokenSet, options?: {
|
|
32
|
-
interactive?: boolean;
|
|
33
|
-
}): Promise<TokenSet>;
|
|
34
|
-
private loginClientCredentials;
|
|
35
|
-
private loginJwtBearer;
|
|
36
|
-
private loginTokenExchange;
|
|
37
|
-
/**
|
|
38
|
-
* Shared driver for jwt_bearer and token_exchange. Both grants:
|
|
39
|
-
* - resolve a platform-supplied JWT from `subjectTokenSource`
|
|
40
|
-
* - POST it to the token endpoint with grant-specific form fields
|
|
41
|
-
* - get back an access token (refresh token is NOT expected for either)
|
|
42
|
-
*/
|
|
43
|
-
private postFederatedGrant;
|
|
44
|
-
/**
|
|
45
|
-
* Resolve endpoints for the configured flow. Skips OIDC discovery entirely
|
|
46
|
-
* when the explicit endpoints needed for the flow are all present in config
|
|
47
|
-
* — discovery is unavailable on RFC 8414-only servers and on Keycloak
|
|
48
|
-
* realms where the well-known doc is locked down.
|
|
49
|
-
*/
|
|
50
|
-
private resolveEndpoints;
|
|
51
|
-
private hasExplicitEndpointsForFlow;
|
|
52
|
-
private refreshToken;
|
|
53
|
-
private loginDeviceCode;
|
|
54
|
-
private loginInteractive;
|
|
55
|
-
}
|
|
56
|
-
export {};
|