@palantir/pack.auth.foundry 0.0.1-beta.1
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/.turbo/turbo-lint.log +20 -0
- package/.turbo/turbo-transpileBrowser.log +5 -0
- package/.turbo/turbo-transpileCjs.log +5 -0
- package/.turbo/turbo-transpileEsm.log +5 -0
- package/.turbo/turbo-transpileTypes.log +5 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/LICENSE.txt +13 -0
- package/README.md +159 -0
- package/build/browser/index.js +374 -0
- package/build/browser/index.js.map +1 -0
- package/build/cjs/index.cjs +381 -0
- package/build/cjs/index.cjs.map +1 -0
- package/build/cjs/index.d.cts +90 -0
- package/build/esm/index.js +374 -0
- package/build/esm/index.js.map +1 -0
- package/build/types/AuthModuleConfig.d.ts +1 -0
- package/build/types/AuthModuleConfig.d.ts.map +1 -0
- package/build/types/__tests__/AuthServiceConfidential.test.d.ts +1 -0
- package/build/types/__tests__/AuthServiceConfidential.test.d.ts.map +1 -0
- package/build/types/__tests__/AuthServicePublic.test.d.ts +1 -0
- package/build/types/__tests__/AuthServicePublic.test.d.ts.map +1 -0
- package/build/types/__tests__/AuthServiceStatic.test.d.ts +1 -0
- package/build/types/__tests__/AuthServiceStatic.test.d.ts.map +1 -0
- package/build/types/auth/AuthServiceBase.d.ts +32 -0
- package/build/types/auth/AuthServiceBase.d.ts.map +1 -0
- package/build/types/auth/AuthServiceConfidential.d.ts +20 -0
- package/build/types/auth/AuthServiceConfidential.d.ts.map +1 -0
- package/build/types/auth/AuthServicePublic.d.ts +23 -0
- package/build/types/auth/AuthServicePublic.d.ts.map +1 -0
- package/build/types/auth/AuthServiceStatic.d.ts +17 -0
- package/build/types/auth/AuthServiceStatic.d.ts.map +1 -0
- package/build/types/index.d.ts +4 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/utils/jwtUtils.d.ts +28 -0
- package/build/types/utils/jwtUtils.d.ts.map +1 -0
- package/package.json +74 -0
- package/src/AuthModuleConfig.ts +17 -0
- package/src/__tests__/AuthServiceConfidential.test.ts +407 -0
- package/src/__tests__/AuthServicePublic.test.ts +413 -0
- package/src/__tests__/AuthServiceStatic.test.ts +341 -0
- package/src/auth/AuthServiceBase.ts +201 -0
- package/src/auth/AuthServiceConfidential.ts +96 -0
- package/src/auth/AuthServicePublic.ts +124 -0
- package/src/auth/AuthServiceStatic.ts +91 -0
- package/src/index.ts +20 -0
- package/src/utils/jwtUtils.ts +127 -0
- package/tsconfig.json +21 -0
- package/vitest.config.mjs +26 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var pack_auth = require('@palantir/pack.auth');
|
|
4
|
+
var foundry_admin = require('@osdk/foundry.admin');
|
|
5
|
+
|
|
6
|
+
// src/auth/AuthServiceConfidential.ts
|
|
7
|
+
|
|
8
|
+
// src/utils/jwtUtils.ts
|
|
9
|
+
function maybeDecodeUuidClaim(value) {
|
|
10
|
+
if (!Array.isArray(value)) {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
13
|
+
if (value.length === 16 && value.every((v) => typeof v === "number")) {
|
|
14
|
+
return decodeUuidBytes(value);
|
|
15
|
+
}
|
|
16
|
+
return void 0;
|
|
17
|
+
}
|
|
18
|
+
function decodeUuidBytes(bytes) {
|
|
19
|
+
if (bytes.length !== 16) {
|
|
20
|
+
return "";
|
|
21
|
+
}
|
|
22
|
+
const hex = bytes.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
23
|
+
return [hex.slice(0, 8), hex.slice(8, 12), hex.slice(12, 16), hex.slice(16, 20), hex.slice(20, 32)].join("-");
|
|
24
|
+
}
|
|
25
|
+
function parseJwtToken(token) {
|
|
26
|
+
if (!token) {
|
|
27
|
+
return void 0;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const parts = token.split(".");
|
|
31
|
+
if (parts.length !== 3) {
|
|
32
|
+
return void 0;
|
|
33
|
+
}
|
|
34
|
+
const payload = parts[1];
|
|
35
|
+
if (!payload) {
|
|
36
|
+
return void 0;
|
|
37
|
+
}
|
|
38
|
+
const paddedPayload = payload.padEnd(payload.length + (4 - payload.length % 4) % 4, "=");
|
|
39
|
+
const decoded = JSON.parse(atob(paddedPayload));
|
|
40
|
+
return {
|
|
41
|
+
// JWT exp is seconds since epoch, convert to ms
|
|
42
|
+
expiryInstantUtc: typeof decoded.exp === "number" ? decoded.exp * 1e3 : void 0,
|
|
43
|
+
orgId: maybeDecodeUuidClaim(decoded.org),
|
|
44
|
+
sessionId: maybeDecodeUuidClaim(decoded.sid),
|
|
45
|
+
tokenId: maybeDecodeUuidClaim(decoded.jti),
|
|
46
|
+
userId: maybeDecodeUuidClaim(decoded.sub)
|
|
47
|
+
};
|
|
48
|
+
} catch {
|
|
49
|
+
return void 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/auth/AuthServiceBase.ts
|
|
54
|
+
var AuthServiceBase = class {
|
|
55
|
+
currentState;
|
|
56
|
+
isTokenValidated = false;
|
|
57
|
+
currentUserId;
|
|
58
|
+
cachedUserData;
|
|
59
|
+
stateCallbacks = /* @__PURE__ */ new Set();
|
|
60
|
+
tokenChangeCallbacks = /* @__PURE__ */ new Set();
|
|
61
|
+
currentToken;
|
|
62
|
+
app;
|
|
63
|
+
logger;
|
|
64
|
+
constructor(app, logger, initialState = pack_auth.AuthState.Unauthenticated) {
|
|
65
|
+
this.app = app;
|
|
66
|
+
this.logger = logger;
|
|
67
|
+
this.currentState = initialState;
|
|
68
|
+
}
|
|
69
|
+
clearUserState() {
|
|
70
|
+
this.isTokenValidated = false;
|
|
71
|
+
this.currentUserId = void 0;
|
|
72
|
+
this.cachedUserData = void 0;
|
|
73
|
+
}
|
|
74
|
+
isAuthenticated() {
|
|
75
|
+
return this.getTokenOrUndefined() != null;
|
|
76
|
+
}
|
|
77
|
+
getCurrentUserId() {
|
|
78
|
+
return this.isTokenValidated ? this.currentUserId : void 0;
|
|
79
|
+
}
|
|
80
|
+
isValidated() {
|
|
81
|
+
return this.isTokenValidated;
|
|
82
|
+
}
|
|
83
|
+
async validateToken() {
|
|
84
|
+
if (!this.isAuthenticated()) {
|
|
85
|
+
this.clearUserState();
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
if (this.app.config.isTestMode) {
|
|
89
|
+
this.isTokenValidated = true;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const user = await foundry_admin.Users.getCurrent(this.app.config.osdkClient);
|
|
94
|
+
this.isTokenValidated = true;
|
|
95
|
+
this.cachedUserData = user;
|
|
96
|
+
this.currentUserId = user.id;
|
|
97
|
+
return true;
|
|
98
|
+
} catch (error) {
|
|
99
|
+
this.logger.error("Token validation failed", error);
|
|
100
|
+
this.clearUserState();
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
onAuthStateChange(callback) {
|
|
105
|
+
this.stateCallbacks.add(callback);
|
|
106
|
+
try {
|
|
107
|
+
callback({
|
|
108
|
+
state: this.currentState
|
|
109
|
+
});
|
|
110
|
+
} catch (err) {
|
|
111
|
+
this.logger.error("Error in auth state callback:", err);
|
|
112
|
+
}
|
|
113
|
+
return () => {
|
|
114
|
+
this.stateCallbacks.delete(callback);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
onTokenChange(callback) {
|
|
118
|
+
this.tokenChangeCallbacks.add(callback);
|
|
119
|
+
const token = this.getTokenOrUndefined();
|
|
120
|
+
if (token != null) {
|
|
121
|
+
const info = parseJwtToken(token) ?? {};
|
|
122
|
+
try {
|
|
123
|
+
callback(token, info);
|
|
124
|
+
} catch (err) {
|
|
125
|
+
this.logger.error("Error in token change callback:", err);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return () => {
|
|
129
|
+
this.tokenChangeCallbacks.delete(callback);
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
getCurrentState() {
|
|
133
|
+
return this.currentState;
|
|
134
|
+
}
|
|
135
|
+
async getUserData(userId, force) {
|
|
136
|
+
if (!this.isTokenValidated || !this.currentUserId || this.currentUserId !== userId) {
|
|
137
|
+
throw new Error(`User data not available for userId: ${userId}`);
|
|
138
|
+
}
|
|
139
|
+
if (!force && this.cachedUserData) {
|
|
140
|
+
return this.cachedUserData;
|
|
141
|
+
}
|
|
142
|
+
if (this.app.config.isTestMode) {
|
|
143
|
+
throw new Error("Cannot refresh user data in test mode");
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const user = await foundry_admin.Users.get(this.app.config.osdkClient, userId);
|
|
147
|
+
this.cachedUserData = user;
|
|
148
|
+
return user;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
this.logger.error("Failed to refresh user data", error);
|
|
151
|
+
throw new Error("Failed to refresh user data");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
dispose() {
|
|
155
|
+
this.stateCallbacks.clear();
|
|
156
|
+
this.tokenChangeCallbacks.clear();
|
|
157
|
+
this.clearUserState();
|
|
158
|
+
}
|
|
159
|
+
notifyTokenChange(token) {
|
|
160
|
+
const info = (token != null ? parseJwtToken(token) : void 0) ?? {};
|
|
161
|
+
this.tokenChangeCallbacks.forEach((callback) => {
|
|
162
|
+
try {
|
|
163
|
+
callback(token, info);
|
|
164
|
+
} catch (err) {
|
|
165
|
+
this.logger.error("Error in token change callback:", err);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
updateState(newState, error) {
|
|
170
|
+
const previousState = this.currentState;
|
|
171
|
+
this.currentState = newState;
|
|
172
|
+
const event = {
|
|
173
|
+
previousState,
|
|
174
|
+
state: newState,
|
|
175
|
+
error
|
|
176
|
+
};
|
|
177
|
+
this.stateCallbacks.forEach((callback) => {
|
|
178
|
+
try {
|
|
179
|
+
callback(event);
|
|
180
|
+
} catch (err) {
|
|
181
|
+
this.logger.error("Error in auth state callback:", err);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
// src/auth/AuthServiceConfidential.ts
|
|
188
|
+
var AuthServiceConfidential = class extends AuthServiceBase {
|
|
189
|
+
oauthClient;
|
|
190
|
+
constructor(app, oauthClient) {
|
|
191
|
+
const initialState = oauthClient.getTokenOrUndefined() ? pack_auth.AuthState.Authenticated : pack_auth.AuthState.Unauthenticated;
|
|
192
|
+
super(app, app.config.logger.child({}, {
|
|
193
|
+
msgPrefix: "AuthServiceConfidential"
|
|
194
|
+
}), initialState);
|
|
195
|
+
this.oauthClient = oauthClient;
|
|
196
|
+
this.oauthClient.addEventListener("signIn", this.signInHandler);
|
|
197
|
+
this.oauthClient.addEventListener("signOut", this.signOutHandler);
|
|
198
|
+
}
|
|
199
|
+
async getToken() {
|
|
200
|
+
return this.oauthClient();
|
|
201
|
+
}
|
|
202
|
+
signInHandler = () => {
|
|
203
|
+
this.updateState(pack_auth.AuthState.Authenticated);
|
|
204
|
+
const token = this.getTokenOrUndefined();
|
|
205
|
+
this.notifyTokenChange(token);
|
|
206
|
+
};
|
|
207
|
+
signOutHandler = () => {
|
|
208
|
+
this.updateState(pack_auth.AuthState.Unauthenticated);
|
|
209
|
+
this.notifyTokenChange(void 0);
|
|
210
|
+
};
|
|
211
|
+
getTokenOrUndefined() {
|
|
212
|
+
return this.oauthClient.getTokenOrUndefined();
|
|
213
|
+
}
|
|
214
|
+
async signIn() {
|
|
215
|
+
try {
|
|
216
|
+
this.updateState(pack_auth.AuthState.Authenticating);
|
|
217
|
+
await this.oauthClient.signIn();
|
|
218
|
+
} catch (error) {
|
|
219
|
+
this.updateState(pack_auth.AuthState.Error, error instanceof Error ? error : new Error(String(error)));
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async signOut() {
|
|
224
|
+
try {
|
|
225
|
+
this.clearUserState();
|
|
226
|
+
await this.oauthClient.signOut();
|
|
227
|
+
} catch (error) {
|
|
228
|
+
this.updateState(pack_auth.AuthState.Error, error instanceof Error ? error : new Error(String(error)));
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
dispose() {
|
|
233
|
+
this.oauthClient.removeEventListener("signIn", this.signInHandler);
|
|
234
|
+
this.oauthClient.removeEventListener("signOut", this.signOutHandler);
|
|
235
|
+
super.dispose();
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
function createConfidentialOauthService(app, oauthClient) {
|
|
239
|
+
return new AuthServiceConfidential(app, oauthClient);
|
|
240
|
+
}
|
|
241
|
+
var AuthServicePublic = class extends AuthServiceBase {
|
|
242
|
+
hasInitialized = false;
|
|
243
|
+
oauthClient;
|
|
244
|
+
constructor(app, oauthClient) {
|
|
245
|
+
super(app, app.config.logger.child({}, {
|
|
246
|
+
msgPrefix: "AuthServicePublic"
|
|
247
|
+
}), pack_auth.AuthState.Initializing);
|
|
248
|
+
this.oauthClient = oauthClient;
|
|
249
|
+
this.oauthClient.addEventListener("signIn", this.signInHandler);
|
|
250
|
+
this.oauthClient.addEventListener("signOut", this.signOutHandler);
|
|
251
|
+
this.oauthClient.addEventListener("refresh", this.refreshHandler);
|
|
252
|
+
}
|
|
253
|
+
async getToken() {
|
|
254
|
+
return this.oauthClient();
|
|
255
|
+
}
|
|
256
|
+
signInHandler = () => {
|
|
257
|
+
const token = this.getTokenOrUndefined();
|
|
258
|
+
this.notifyTokenChange(token);
|
|
259
|
+
this.updateState(pack_auth.AuthState.Authenticated);
|
|
260
|
+
};
|
|
261
|
+
signOutHandler = () => {
|
|
262
|
+
this.notifyTokenChange(void 0);
|
|
263
|
+
this.updateState(pack_auth.AuthState.Unauthenticated);
|
|
264
|
+
};
|
|
265
|
+
refreshHandler = () => {
|
|
266
|
+
const token = this.getTokenOrUndefined();
|
|
267
|
+
this.notifyTokenChange(token);
|
|
268
|
+
this.updateState(pack_auth.AuthState.Authenticated);
|
|
269
|
+
};
|
|
270
|
+
getTokenOrUndefined() {
|
|
271
|
+
return this.oauthClient.getTokenOrUndefined();
|
|
272
|
+
}
|
|
273
|
+
onAuthStateChange(callback) {
|
|
274
|
+
const unsubscribe = super.onAuthStateChange(callback);
|
|
275
|
+
if (!this.hasInitialized && this.currentState === pack_auth.AuthState.Initializing) {
|
|
276
|
+
this.hasInitialized = true;
|
|
277
|
+
void this.signIn().catch(() => {
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return unsubscribe;
|
|
281
|
+
}
|
|
282
|
+
async signIn() {
|
|
283
|
+
try {
|
|
284
|
+
this.updateState(pack_auth.AuthState.Authenticating);
|
|
285
|
+
await this.oauthClient.signIn();
|
|
286
|
+
} catch (error) {
|
|
287
|
+
this.updateState(pack_auth.AuthState.Error, error instanceof Error ? error : new Error(String(error)));
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async signOut() {
|
|
292
|
+
try {
|
|
293
|
+
this.clearUserState();
|
|
294
|
+
await this.oauthClient.signOut();
|
|
295
|
+
} catch (error) {
|
|
296
|
+
this.updateState(pack_auth.AuthState.Error, error instanceof Error ? error : new Error(String(error)));
|
|
297
|
+
throw error;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
async refresh() {
|
|
301
|
+
try {
|
|
302
|
+
await this.oauthClient.refresh();
|
|
303
|
+
} catch (error) {
|
|
304
|
+
this.updateState(pack_auth.AuthState.Error, error instanceof Error ? error : new Error(String(error)));
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
dispose() {
|
|
309
|
+
this.oauthClient.removeEventListener("signIn", this.signInHandler);
|
|
310
|
+
this.oauthClient.removeEventListener("signOut", this.signOutHandler);
|
|
311
|
+
this.oauthClient.removeEventListener("refresh", this.refreshHandler);
|
|
312
|
+
super.dispose();
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
function createPublicOauthService(app, oauthClient) {
|
|
316
|
+
return new AuthServicePublic(app, oauthClient);
|
|
317
|
+
}
|
|
318
|
+
var AuthServiceStatic = class extends AuthServiceBase {
|
|
319
|
+
tokenProvider;
|
|
320
|
+
latestToken;
|
|
321
|
+
constructor(app, tokenProvider) {
|
|
322
|
+
super(app, app.config.logger.child({}, {
|
|
323
|
+
msgPrefix: "AuthServiceStatic"
|
|
324
|
+
}), pack_auth.AuthState.Unauthenticated);
|
|
325
|
+
this.tokenProvider = tokenProvider;
|
|
326
|
+
void this.getToken().catch(() => {
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
async getToken() {
|
|
330
|
+
try {
|
|
331
|
+
const token = await this.tokenProvider();
|
|
332
|
+
if (this.latestToken !== token) {
|
|
333
|
+
this.latestToken = token;
|
|
334
|
+
this.notifyTokenChange(token);
|
|
335
|
+
if (this.currentState !== pack_auth.AuthState.Authenticated) {
|
|
336
|
+
this.updateState(pack_auth.AuthState.Authenticated);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return token;
|
|
340
|
+
} catch (error) {
|
|
341
|
+
if (this.latestToken !== void 0) {
|
|
342
|
+
this.latestToken = void 0;
|
|
343
|
+
this.notifyTokenChange(void 0);
|
|
344
|
+
}
|
|
345
|
+
this.updateState(pack_auth.AuthState.Error, error);
|
|
346
|
+
throw error;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
getTokenOrUndefined() {
|
|
350
|
+
return this.latestToken;
|
|
351
|
+
}
|
|
352
|
+
isAuthenticated() {
|
|
353
|
+
return this.latestToken != null;
|
|
354
|
+
}
|
|
355
|
+
signIn() {
|
|
356
|
+
return Promise.resolve();
|
|
357
|
+
}
|
|
358
|
+
signOut() {
|
|
359
|
+
this.clearUserState();
|
|
360
|
+
this.latestToken = void 0;
|
|
361
|
+
this.updateState(pack_auth.AuthState.Unauthenticated);
|
|
362
|
+
return Promise.reject(new Error("Sign out not supported for static token providers"));
|
|
363
|
+
}
|
|
364
|
+
dispose() {
|
|
365
|
+
super.dispose();
|
|
366
|
+
this.latestToken = void 0;
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
function createStaticTokenService(app, tokenProvider) {
|
|
370
|
+
return new AuthServiceStatic(app, tokenProvider);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
Object.defineProperty(exports, "createAuthModuleConfig", {
|
|
374
|
+
enumerable: true,
|
|
375
|
+
get: function () { return pack_auth.createAuthModuleConfig; }
|
|
376
|
+
});
|
|
377
|
+
exports.createConfidentialOauthService = createConfidentialOauthService;
|
|
378
|
+
exports.createPublicOauthService = createPublicOauthService;
|
|
379
|
+
exports.createStaticTokenService = createStaticTokenService;
|
|
380
|
+
//# sourceMappingURL=index.cjs.map
|
|
381
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/jwtUtils.ts","../../src/auth/AuthServiceBase.ts","../../src/auth/AuthServiceConfidential.ts","../../src/auth/AuthServicePublic.ts","../../src/auth/AuthServiceStatic.ts"],"names":["AuthState","Users"],"mappings":"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","file":"index.cjs","sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Decode a Palantir-specific JWT claim that stores UUIDs as 16-byte arrays.\n * These are the sub, sid, jti, and org claims.\n */\nfunction maybeDecodeUuidClaim(value) {\n if (!Array.isArray(value)) {\n return undefined;\n }\n if (value.length === 16 && value.every(v => typeof v === \"number\")) {\n // Convert 16-byte array to UUID string\n return decodeUuidBytes(value);\n }\n return undefined;\n}\n\n/**\n * Convert a 16-byte array to UUID string format.\n * Based on Palantir's UUID encoding format.\n */\nfunction decodeUuidBytes(bytes) {\n if (bytes.length !== 16) {\n return \"\";\n }\n\n // Convert bytes to hex string\n const hex = bytes.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n // Format as UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n return [hex.slice(0, 8), hex.slice(8, 12), hex.slice(12, 16), hex.slice(16, 20), hex.slice(20, 32)].join(\"-\");\n}\n\n/**\n * Represents the parsed payload from a JWT token (unverified).\n * The information provided should not be used for security-sensitive\n * applications unless verified through some other process.\n */\n\n/**\n * Parse JWT token to extract unverified claims including userId, sessionId, tokenId, organizationId, and expiry.\n * This does NOT verify the token signature - it only extracts payload data.\n *\n * @param token - JWT token string\n * @returns Unverified token info or undefined if parsing fails\n */\nexport function parseJwtToken(token) {\n if (!token) {\n return undefined;\n }\n try {\n // JWT tokens have 3 parts separated by dots: header.payload.signature\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n if (!payload) {\n return undefined;\n }\n\n // Add padding if needed for base64 decoding\n const paddedPayload = payload.padEnd(payload.length + (4 - payload.length % 4) % 4, \"=\");\n const decoded = JSON.parse(atob(paddedPayload));\n return {\n // JWT exp is seconds since epoch, convert to ms\n expiryInstantUtc: typeof decoded.exp === \"number\" ? decoded.exp * 1000 : undefined,\n orgId: maybeDecodeUuidClaim(decoded.org),\n sessionId: maybeDecodeUuidClaim(decoded.sid),\n tokenId: maybeDecodeUuidClaim(decoded.jti),\n userId: maybeDecodeUuidClaim(decoded.sub)\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if a JWT token is expired based on its exp claim (unverified).\n *\n * @param tokenInfo - Unverified token info\n * @returns true if token is expired, false if valid or no expiry info\n */\nexport function isTokenExpired(tokenInfo) {\n if (!tokenInfo.expiryInstantUtc) {\n return false; // No expiry info, assume valid\n }\n const now = Date.now();\n return tokenInfo.expiryInstantUtc < now;\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Users } from \"@osdk/foundry.admin\";\nimport { AuthState } from \"@palantir/pack.auth\";\nimport { parseJwtToken } from \"../utils/jwtUtils.js\";\nexport class AuthServiceBase {\n currentState;\n isTokenValidated = false;\n currentUserId;\n cachedUserData;\n stateCallbacks = new Set();\n tokenChangeCallbacks = new Set();\n currentToken;\n app;\n logger;\n constructor(app, logger, initialState = AuthState.Unauthenticated) {\n this.app = app;\n this.logger = logger;\n this.currentState = initialState;\n }\n clearUserState() {\n this.isTokenValidated = false;\n this.currentUserId = undefined;\n this.cachedUserData = undefined;\n }\n isAuthenticated() {\n return this.getTokenOrUndefined() != null;\n }\n getCurrentUserId() {\n return this.isTokenValidated ? this.currentUserId : undefined;\n }\n isValidated() {\n return this.isTokenValidated;\n }\n async validateToken() {\n if (!this.isAuthenticated()) {\n this.clearUserState();\n return false;\n }\n if (this.app.config.isTestMode) {\n this.isTokenValidated = true;\n return true;\n }\n try {\n const user = await Users.getCurrent(this.app.config.osdkClient);\n this.isTokenValidated = true;\n this.cachedUserData = user;\n this.currentUserId = user.id;\n return true;\n } catch (error) {\n this.logger.error(\"Token validation failed\", error);\n this.clearUserState();\n return false;\n }\n }\n onAuthStateChange(callback) {\n this.stateCallbacks.add(callback);\n try {\n callback({\n state: this.currentState\n });\n } catch (err) {\n this.logger.error(\"Error in auth state callback:\", err);\n }\n return () => {\n this.stateCallbacks.delete(callback);\n };\n }\n onTokenChange(callback) {\n this.tokenChangeCallbacks.add(callback);\n\n // Immediately notify with current token if available\n const token = this.getTokenOrUndefined();\n if (token != null) {\n const info = parseJwtToken(token) ?? {};\n try {\n callback(token, info);\n } catch (err) {\n this.logger.error(\"Error in token change callback:\", err);\n }\n }\n return () => {\n this.tokenChangeCallbacks.delete(callback);\n };\n }\n getCurrentState() {\n return this.currentState;\n }\n async getUserData(userId, force) {\n if (!this.isTokenValidated || !this.currentUserId || this.currentUserId !== userId) {\n throw new Error(`User data not available for userId: ${userId}`);\n }\n if (!force && this.cachedUserData) {\n return this.cachedUserData;\n }\n if (this.app.config.isTestMode) {\n throw new Error(\"Cannot refresh user data in test mode\");\n }\n try {\n // TODO: debounce and use Users.getBatch for efficiency when looking up multiple users\n const user = await Users.get(this.app.config.osdkClient, userId);\n this.cachedUserData = user;\n return user;\n } catch (error) {\n this.logger.error(\"Failed to refresh user data\", error);\n throw new Error(\"Failed to refresh user data\");\n }\n }\n dispose() {\n this.stateCallbacks.clear();\n this.tokenChangeCallbacks.clear();\n this.clearUserState();\n }\n notifyTokenChange(token) {\n const info = (token != null ? parseJwtToken(token) : undefined) ?? {};\n this.tokenChangeCallbacks.forEach(callback => {\n try {\n callback(token, info);\n } catch (err) {\n this.logger.error(\"Error in token change callback:\", err);\n }\n });\n }\n updateState(newState, error) {\n const previousState = this.currentState;\n this.currentState = newState;\n const event = {\n previousState,\n state: newState,\n error\n };\n this.stateCallbacks.forEach(callback => {\n try {\n callback(event);\n } catch (err) {\n this.logger.error(\"Error in auth state callback:\", err);\n }\n });\n }\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthState } from \"@palantir/pack.auth\";\nimport { AuthServiceBase } from \"./AuthServiceBase.js\";\nexport class AuthServiceConfidential extends AuthServiceBase {\n oauthClient;\n constructor(app, oauthClient) {\n const initialState = oauthClient.getTokenOrUndefined() ? AuthState.Authenticated : AuthState.Unauthenticated;\n super(app, app.config.logger.child({}, {\n msgPrefix: \"AuthServiceConfidential\"\n }), initialState);\n this.oauthClient = oauthClient;\n this.oauthClient.addEventListener(\"signIn\", this.signInHandler);\n this.oauthClient.addEventListener(\"signOut\", this.signOutHandler);\n }\n async getToken() {\n return this.oauthClient();\n }\n signInHandler = () => {\n this.updateState(AuthState.Authenticated);\n const token = this.getTokenOrUndefined();\n this.notifyTokenChange(token);\n };\n signOutHandler = () => {\n this.updateState(AuthState.Unauthenticated);\n this.notifyTokenChange(undefined);\n };\n getTokenOrUndefined() {\n return this.oauthClient.getTokenOrUndefined();\n }\n async signIn() {\n try {\n this.updateState(AuthState.Authenticating);\n await this.oauthClient.signIn();\n } catch (error) {\n this.updateState(AuthState.Error, error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n async signOut() {\n try {\n this.clearUserState();\n await this.oauthClient.signOut();\n } catch (error) {\n this.updateState(AuthState.Error, error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n dispose() {\n this.oauthClient.removeEventListener(\"signIn\", this.signInHandler);\n this.oauthClient.removeEventListener(\"signOut\", this.signOutHandler);\n super.dispose();\n }\n}\n\n/**\n * Creates a confidential OAuth auth service that wraps a ConfidentialOauthClient\n */\nexport function createConfidentialOauthService(app, oauthClient) {\n return new AuthServiceConfidential(app, oauthClient);\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthState } from \"@palantir/pack.auth\";\nimport { AuthServiceBase } from \"./AuthServiceBase.js\";\nexport class AuthServicePublic extends AuthServiceBase {\n hasInitialized = false;\n oauthClient;\n constructor(app, oauthClient) {\n super(app, app.config.logger.child({}, {\n msgPrefix: \"AuthServicePublic\"\n }), AuthState.Initializing);\n this.oauthClient = oauthClient;\n this.oauthClient.addEventListener(\"signIn\", this.signInHandler);\n this.oauthClient.addEventListener(\"signOut\", this.signOutHandler);\n this.oauthClient.addEventListener(\"refresh\", this.refreshHandler);\n }\n async getToken() {\n return this.oauthClient();\n }\n signInHandler = () => {\n const token = this.getTokenOrUndefined();\n this.notifyTokenChange(token);\n this.updateState(AuthState.Authenticated);\n };\n signOutHandler = () => {\n this.notifyTokenChange(undefined);\n this.updateState(AuthState.Unauthenticated);\n };\n refreshHandler = () => {\n const token = this.getTokenOrUndefined();\n this.notifyTokenChange(token);\n this.updateState(AuthState.Authenticated);\n };\n getTokenOrUndefined() {\n return this.oauthClient.getTokenOrUndefined();\n }\n onAuthStateChange(callback) {\n const unsubscribe = super.onAuthStateChange(callback);\n if (!this.hasInitialized && this.currentState === AuthState.Initializing) {\n this.hasInitialized = true;\n void this.signIn().catch(() => {\n // Don't allow unhandled rejection to bubble up, mostly for testing.\n // Note the signIn method will log errors and throw for promise consumers,\n // but we don't need to handle anything here.\n });\n }\n return unsubscribe;\n }\n async signIn() {\n try {\n this.updateState(AuthState.Authenticating);\n await this.oauthClient.signIn();\n } catch (error) {\n this.updateState(AuthState.Error, error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n async signOut() {\n try {\n this.clearUserState();\n await this.oauthClient.signOut();\n } catch (error) {\n this.updateState(AuthState.Error, error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n async refresh() {\n try {\n await this.oauthClient.refresh();\n } catch (error) {\n this.updateState(AuthState.Error, error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n dispose() {\n this.oauthClient.removeEventListener(\"signIn\", this.signInHandler);\n this.oauthClient.removeEventListener(\"signOut\", this.signOutHandler);\n this.oauthClient.removeEventListener(\"refresh\", this.refreshHandler);\n super.dispose();\n }\n}\n\n/**\n * Creates a public OAuth auth service that wraps a PublicOauthClient\n */\nexport function createPublicOauthService(app, oauthClient) {\n return new AuthServicePublic(app, oauthClient);\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthState } from \"@palantir/pack.auth\";\nimport { AuthServiceBase } from \"./AuthServiceBase.js\";\nexport class AuthServiceStatic extends AuthServiceBase {\n tokenProvider;\n latestToken;\n constructor(app, tokenProvider) {\n super(app, app.config.logger.child({}, {\n msgPrefix: \"AuthServiceStatic\"\n }), AuthState.Unauthenticated);\n this.tokenProvider = tokenProvider;\n void this.getToken().catch(() => {});\n }\n async getToken() {\n try {\n const token = await this.tokenProvider();\n if (this.latestToken !== token) {\n this.latestToken = token;\n this.notifyTokenChange(token);\n if (this.currentState !== AuthState.Authenticated) {\n this.updateState(AuthState.Authenticated);\n }\n }\n return token;\n } catch (error) {\n if (this.latestToken !== undefined) {\n this.latestToken = undefined;\n this.notifyTokenChange(undefined);\n }\n this.updateState(AuthState.Error, error);\n throw error;\n }\n }\n getTokenOrUndefined() {\n return this.latestToken;\n }\n isAuthenticated() {\n return this.latestToken != null;\n }\n signIn() {\n return Promise.resolve();\n }\n signOut() {\n this.clearUserState();\n this.latestToken = undefined;\n this.updateState(AuthState.Unauthenticated);\n return Promise.reject(new Error(\"Sign out not supported for static token providers\"));\n }\n dispose() {\n super.dispose();\n this.latestToken = undefined;\n }\n}\n\n/**\n * Creates a static token auth service for CLI/service scenarios where a token is provided externally.\n */\nexport function createStaticTokenService(app, tokenProvider) {\n return new AuthServiceStatic(app, tokenProvider);\n}"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createConfidentialOauthClient, PublicOauthClient } from '@osdk/oauth';
|
|
2
|
+
import { PackAppInternal, Unsubscribe, TokenProvider } from '@palantir/pack.core';
|
|
3
|
+
import { Logger } from '@osdk/api';
|
|
4
|
+
import { BaseAuthService, AuthState, AuthStateCallback, TokenChangeCallback } from '@palantir/pack.auth';
|
|
5
|
+
export { createAuthModuleConfig } from '@palantir/pack.auth';
|
|
6
|
+
|
|
7
|
+
declare abstract class AuthServiceBase implements BaseAuthService {
|
|
8
|
+
protected currentState: AuthState;
|
|
9
|
+
protected isTokenValidated: boolean;
|
|
10
|
+
protected currentUserId: string | undefined;
|
|
11
|
+
protected cachedUserData: unknown;
|
|
12
|
+
private readonly stateCallbacks;
|
|
13
|
+
private readonly tokenChangeCallbacks;
|
|
14
|
+
protected currentToken?: string;
|
|
15
|
+
protected readonly app: PackAppInternal;
|
|
16
|
+
protected readonly logger: Logger;
|
|
17
|
+
constructor(app: PackAppInternal, logger: Logger, initialState?: AuthState);
|
|
18
|
+
abstract getToken(): Promise<string>;
|
|
19
|
+
protected clearUserState(): void;
|
|
20
|
+
isAuthenticated(): boolean;
|
|
21
|
+
getCurrentUserId(): string | undefined;
|
|
22
|
+
abstract getTokenOrUndefined(): string | undefined;
|
|
23
|
+
isValidated(): boolean;
|
|
24
|
+
validateToken(): Promise<boolean>;
|
|
25
|
+
abstract signIn(): Promise<void>;
|
|
26
|
+
abstract signOut(): Promise<void>;
|
|
27
|
+
refresh?(): Promise<void>;
|
|
28
|
+
onAuthStateChange(callback: AuthStateCallback): Unsubscribe;
|
|
29
|
+
onTokenChange(callback: TokenChangeCallback): Unsubscribe;
|
|
30
|
+
getCurrentState(): AuthState;
|
|
31
|
+
getUserData(userId: string, force?: boolean): Promise<unknown>;
|
|
32
|
+
dispose(): void;
|
|
33
|
+
protected notifyTokenChange(token: string | undefined): void;
|
|
34
|
+
protected updateState(newState: AuthState, error?: Error): void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type ConfidentialOauthClient = ReturnType<typeof createConfidentialOauthClient>;
|
|
38
|
+
declare class AuthServiceConfidential extends AuthServiceBase {
|
|
39
|
+
private readonly oauthClient;
|
|
40
|
+
constructor(app: PackAppInternal, oauthClient: ConfidentialOauthClient);
|
|
41
|
+
getToken(): Promise<string>;
|
|
42
|
+
private readonly signInHandler;
|
|
43
|
+
private readonly signOutHandler;
|
|
44
|
+
getTokenOrUndefined(): string | undefined;
|
|
45
|
+
signIn(): Promise<void>;
|
|
46
|
+
signOut(): Promise<void>;
|
|
47
|
+
dispose(): void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Creates a confidential OAuth auth service that wraps a ConfidentialOauthClient
|
|
51
|
+
*/
|
|
52
|
+
declare function createConfidentialOauthService(app: PackAppInternal, oauthClient: ConfidentialOauthClient): AuthServiceConfidential;
|
|
53
|
+
|
|
54
|
+
declare class AuthServicePublic extends AuthServiceBase {
|
|
55
|
+
private hasInitialized;
|
|
56
|
+
private readonly oauthClient;
|
|
57
|
+
constructor(app: PackAppInternal, oauthClient: PublicOauthClient);
|
|
58
|
+
getToken(): Promise<string>;
|
|
59
|
+
private readonly signInHandler;
|
|
60
|
+
private readonly signOutHandler;
|
|
61
|
+
private readonly refreshHandler;
|
|
62
|
+
getTokenOrUndefined(): string | undefined;
|
|
63
|
+
onAuthStateChange(callback: AuthStateCallback): Unsubscribe;
|
|
64
|
+
signIn(): Promise<void>;
|
|
65
|
+
signOut(): Promise<void>;
|
|
66
|
+
refresh(): Promise<void>;
|
|
67
|
+
dispose(): void;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates a public OAuth auth service that wraps a PublicOauthClient
|
|
71
|
+
*/
|
|
72
|
+
declare function createPublicOauthService(app: PackAppInternal, oauthClient: PublicOauthClient): AuthServicePublic;
|
|
73
|
+
|
|
74
|
+
declare class AuthServiceStatic extends AuthServiceBase {
|
|
75
|
+
private readonly tokenProvider;
|
|
76
|
+
private latestToken;
|
|
77
|
+
constructor(app: PackAppInternal, tokenProvider: TokenProvider);
|
|
78
|
+
getToken(): Promise<string>;
|
|
79
|
+
getTokenOrUndefined(): string | undefined;
|
|
80
|
+
isAuthenticated(): boolean;
|
|
81
|
+
signIn(): Promise<void>;
|
|
82
|
+
signOut(): Promise<void>;
|
|
83
|
+
dispose(): void;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Creates a static token auth service for CLI/service scenarios where a token is provided externally.
|
|
87
|
+
*/
|
|
88
|
+
declare function createStaticTokenService(app: PackAppInternal, tokenProvider: TokenProvider): AuthServiceStatic;
|
|
89
|
+
|
|
90
|
+
export { createConfidentialOauthService, createPublicOauthService, createStaticTokenService };
|