@tern-secure/backend 1.2.0-canary.v20251125170702 → 1.2.0-canary.v20251127221555

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.
Files changed (62) hide show
  1. package/dist/admin/index.js +3 -0
  2. package/dist/admin/index.js.map +1 -1
  3. package/dist/admin/index.mjs +4 -2
  4. package/dist/admin/index.mjs.map +1 -1
  5. package/dist/auth/constants.d.ts +6 -0
  6. package/dist/auth/constants.d.ts.map +1 -0
  7. package/dist/auth/credential.d.ts +27 -0
  8. package/dist/auth/credential.d.ts.map +1 -0
  9. package/dist/auth/getauth.d.ts +1 -0
  10. package/dist/auth/getauth.d.ts.map +1 -1
  11. package/dist/auth/index.js +234 -28
  12. package/dist/auth/index.js.map +1 -1
  13. package/dist/auth/index.mjs +3 -3
  14. package/dist/auth/utils.d.ts +3 -0
  15. package/dist/auth/utils.d.ts.map +1 -0
  16. package/dist/{chunk-MS6L7M3C.mjs → chunk-DJLDUW7J.mjs} +174 -12
  17. package/dist/chunk-DJLDUW7J.mjs.map +1 -0
  18. package/dist/{chunk-ASGV4MFO.mjs → chunk-GFH5CXQR.mjs} +2 -2
  19. package/dist/{chunk-DDUNOEIM.mjs → chunk-NXYWC6YO.mjs} +278 -116
  20. package/dist/chunk-NXYWC6YO.mjs.map +1 -0
  21. package/dist/{chunk-DFAJCSBJ.mjs → chunk-WIVOBOZR.mjs} +2 -1
  22. package/dist/chunk-WIVOBOZR.mjs.map +1 -0
  23. package/dist/constants.d.ts +1 -0
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/fireRestApi/createFireApi.d.ts +2 -1
  26. package/dist/fireRestApi/createFireApi.d.ts.map +1 -1
  27. package/dist/fireRestApi/endpoints/AppCheckApi.d.ts +23 -0
  28. package/dist/fireRestApi/endpoints/AppCheckApi.d.ts.map +1 -0
  29. package/dist/fireRestApi/endpoints/TokenApi.d.ts +3 -1
  30. package/dist/fireRestApi/endpoints/TokenApi.d.ts.map +1 -1
  31. package/dist/fireRestApi/endpoints/UserData.d.ts.map +1 -1
  32. package/dist/fireRestApi/endpoints/index.d.ts +1 -0
  33. package/dist/fireRestApi/endpoints/index.d.ts.map +1 -1
  34. package/dist/fireRestApi/request.d.ts.map +1 -1
  35. package/dist/index.js +390 -36
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +159 -12
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/jwt/index.d.ts +1 -0
  40. package/dist/jwt/index.d.ts.map +1 -1
  41. package/dist/jwt/index.js +51 -19
  42. package/dist/jwt/index.js.map +1 -1
  43. package/dist/jwt/index.mjs +8 -132
  44. package/dist/jwt/index.mjs.map +1 -1
  45. package/dist/jwt/signJwt.d.ts +8 -0
  46. package/dist/jwt/signJwt.d.ts.map +1 -1
  47. package/dist/jwt/verifyJwt.d.ts.map +1 -1
  48. package/dist/tokens/authstate.d.ts.map +1 -1
  49. package/dist/tokens/c-authenticateRequestProcessor.d.ts +1 -0
  50. package/dist/tokens/c-authenticateRequestProcessor.d.ts.map +1 -1
  51. package/dist/tokens/request.d.ts.map +1 -1
  52. package/dist/tokens/types.d.ts +2 -1
  53. package/dist/tokens/types.d.ts.map +1 -1
  54. package/dist/tokens/verify.d.ts +2 -2
  55. package/dist/tokens/verify.d.ts.map +1 -1
  56. package/dist/utils/admin-init.d.ts +1 -0
  57. package/dist/utils/admin-init.d.ts.map +1 -1
  58. package/package.json +3 -3
  59. package/dist/chunk-DDUNOEIM.mjs.map +0 -1
  60. package/dist/chunk-DFAJCSBJ.mjs.map +0 -1
  61. package/dist/chunk-MS6L7M3C.mjs.map +0 -1
  62. /package/dist/{chunk-ASGV4MFO.mjs.map → chunk-GFH5CXQR.mjs.map} +0 -0
@@ -3,14 +3,15 @@ import {
3
3
  DEFAULT_CACHE_DURATION,
4
4
  GOOGLE_PUBLIC_KEYS_URL,
5
5
  MAX_CACHE_LAST_UPDATED_AT_SECONDS
6
- } from "./chunk-DFAJCSBJ.mjs";
6
+ } from "./chunk-WIVOBOZR.mjs";
7
7
  import {
8
8
  TokenVerificationError,
9
9
  TokenVerificationErrorReason,
10
10
  createCustomToken,
11
11
  ternDecodeJwt,
12
+ ternSignJwt,
12
13
  verifyJwt
13
- } from "./chunk-DDUNOEIM.mjs";
14
+ } from "./chunk-NXYWC6YO.mjs";
14
15
 
15
16
  // src/tokens/keys.ts
16
17
  var cache = {};
@@ -137,6 +138,109 @@ async function verifyToken(token, options) {
137
138
  }
138
139
  }
139
140
 
141
+ // src/auth/constants.ts
142
+ var TOKEN_EXPIRY_THRESHOLD_MILLIS = 5 * 60 * 1e3;
143
+ var GOOGLE_TOKEN_AUDIENCE = "https://accounts.google.com/o/oauth2/token";
144
+ var GOOGLE_AUTH_TOKEN_HOST = "accounts.google.com";
145
+ var GOOGLE_AUTH_TOKEN_PATH = "/o/oauth2/token";
146
+ var ONE_HOUR_IN_SECONDS = 60 * 60;
147
+
148
+ // src/auth/utils.ts
149
+ async function getDetailFromResponse(response) {
150
+ const json = await response.json();
151
+ if (!json) {
152
+ return "Missing error payload";
153
+ }
154
+ let detail = typeof json.error === "string" ? json.error : json.error?.message ?? "Missing error payload";
155
+ if (json.error_description) {
156
+ detail += " (" + json.error_description + ")";
157
+ }
158
+ return detail;
159
+ }
160
+ async function fetchJson(url, init) {
161
+ return (await fetchAny(url, init)).json();
162
+ }
163
+ async function fetchAny(url, init) {
164
+ const response = await fetch(url, init);
165
+ if (!response.ok) {
166
+ throw new Error(await getDetailFromResponse(response));
167
+ }
168
+ return response;
169
+ }
170
+
171
+ // src/auth/credential.ts
172
+ var accessTokenCache = /* @__PURE__ */ new Map();
173
+ async function requestAccessToken(urlString, init) {
174
+ const json = await fetchJson(urlString, init);
175
+ if (!json.access_token || !json.expires_in) {
176
+ throw new Error("Invalid access token response");
177
+ }
178
+ return {
179
+ accessToken: json.access_token,
180
+ expirationTime: Date.now() + json.expires_in * 1e3
181
+ };
182
+ }
183
+ var ServiceAccountTokenManager = class {
184
+ projectId;
185
+ privateKey;
186
+ clientEmail;
187
+ constructor(serviceAccount) {
188
+ this.projectId = serviceAccount.projectId;
189
+ this.privateKey = serviceAccount.privateKey;
190
+ this.clientEmail = serviceAccount.clientEmail;
191
+ }
192
+ fetchAccessToken = async (url) => {
193
+ const token = await this.createJwt();
194
+ const postData = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + token;
195
+ return requestAccessToken(url, {
196
+ method: "POST",
197
+ headers: {
198
+ "Content-Type": "application/x-www-form-urlencoded",
199
+ Authorization: `Bearer ${token}`,
200
+ Accept: "application/json"
201
+ },
202
+ body: postData
203
+ });
204
+ };
205
+ fetchAndCacheAccessToken = async (url) => {
206
+ const accessToken = await this.fetchAccessToken(url);
207
+ accessTokenCache.set(this.projectId, accessToken);
208
+ return accessToken;
209
+ };
210
+ getAccessToken = async (refresh) => {
211
+ const url = `https://${GOOGLE_AUTH_TOKEN_HOST}${GOOGLE_AUTH_TOKEN_PATH}`;
212
+ if (refresh) {
213
+ return this.fetchAndCacheAccessToken(url);
214
+ }
215
+ const cachedResponse = accessTokenCache.get(this.projectId);
216
+ if (!cachedResponse || cachedResponse.expirationTime - Date.now() <= TOKEN_EXPIRY_THRESHOLD_MILLIS) {
217
+ return this.fetchAndCacheAccessToken(url);
218
+ }
219
+ return cachedResponse;
220
+ };
221
+ createJwt = async () => {
222
+ const iat = Math.floor(Date.now() / 1e3);
223
+ const payload = {
224
+ aud: GOOGLE_TOKEN_AUDIENCE,
225
+ iat,
226
+ exp: iat + ONE_HOUR_IN_SECONDS,
227
+ iss: this.clientEmail,
228
+ sub: this.clientEmail,
229
+ scope: [
230
+ "https://www.googleapis.com/auth/cloud-platform",
231
+ "https://www.googleapis.com/auth/firebase.database",
232
+ "https://www.googleapis.com/auth/firebase.messaging",
233
+ "https://www.googleapis.com/auth/identitytoolkit",
234
+ "https://www.googleapis.com/auth/userinfo.email"
235
+ ].join(" ")
236
+ };
237
+ return ternSignJwt({
238
+ payload,
239
+ privateKey: this.privateKey
240
+ });
241
+ };
242
+ };
243
+
140
244
  // src/auth/getauth.ts
141
245
  var API_KEY_ERROR = "API Key is required";
142
246
  var NO_DATA_ERROR = "No token data received";
@@ -151,9 +255,17 @@ function parseFirebaseResponse(data) {
151
255
  return data;
152
256
  }
153
257
  function getAuth(options) {
154
- const { apiKey } = options;
258
+ const { apiKey, firebaseAdminConfig } = options;
155
259
  const firebaseApiKey = options.firebaseConfig?.apiKey;
156
260
  const effectiveApiKey = apiKey || firebaseApiKey;
261
+ let credential = null;
262
+ if (firebaseAdminConfig?.projectId && firebaseAdminConfig?.privateKey && firebaseAdminConfig?.clientEmail) {
263
+ credential = new ServiceAccountTokenManager({
264
+ projectId: firebaseAdminConfig.projectId,
265
+ privateKey: firebaseAdminConfig.privateKey,
266
+ clientEmail: firebaseAdminConfig.clientEmail
267
+ });
268
+ }
157
269
  async function getUserData(idToken, localId) {
158
270
  if (!effectiveApiKey) {
159
271
  throw new Error(API_KEY_ERROR);
@@ -195,23 +307,23 @@ function getAuth(options) {
195
307
  if (!effectiveApiKey) {
196
308
  throw new Error("API Key is required to create custom token");
197
309
  }
198
- const response = await options.apiClient?.tokens.exchangeCustomForIdAndRefreshTokens(
310
+ const data = await options.apiClient?.tokens.exchangeCustomForIdAndRefreshTokens(
199
311
  effectiveApiKey,
200
312
  {
201
313
  token: customToken,
202
314
  returnSecureToken: true
203
315
  },
204
316
  {
205
- referer: opts.referer
317
+ referer: opts.referer,
318
+ appCheckToken: opts.appCheckToken
206
319
  }
207
320
  );
208
- if (!response?.data) {
321
+ if (!data) {
209
322
  throw new Error("No data received from Firebase token exchange");
210
323
  }
211
- const parsedData = parseFirebaseResponse(response.data);
212
324
  return {
213
- idToken: parsedData.idToken,
214
- refreshToken: parsedData.refreshToken
325
+ idToken: data.idToken,
326
+ refreshToken: data.refreshToken
215
327
  };
216
328
  }
217
329
  async function createCustomIdAndRefreshToken(idToken, opts) {
@@ -225,7 +337,8 @@ function getAuth(options) {
225
337
  source_sign_in_provider: data.firebase.sign_in_provider
226
338
  });
227
339
  const idAndRefreshTokens = await customForIdAndRefreshToken(customToken, {
228
- referer: opts.referer
340
+ referer: opts.referer,
341
+ appCheckToken: opts.appCheckToken
229
342
  });
230
343
  const decodedCustomIdToken = await verifyToken(idAndRefreshTokens.idToken, options);
231
344
  if (decodedCustomIdToken.errors) {
@@ -237,11 +350,60 @@ function getAuth(options) {
237
350
  auth_time: decodedCustomIdToken.data.auth_time
238
351
  };
239
352
  }
353
+ async function exchangeAppCheckToken(idToken) {
354
+ if (!credential) {
355
+ return {
356
+ data: null,
357
+ error: new Error(
358
+ "Firebase Admin config must be provided to exchange App Check tokens."
359
+ )
360
+ };
361
+ }
362
+ if (!effectiveApiKey) {
363
+ return { data: null, error: new Error(API_KEY_ERROR) };
364
+ }
365
+ try {
366
+ const decoded = await verifyToken(idToken, options);
367
+ if (decoded.errors) {
368
+ return { data: null, error: decoded.errors[0] };
369
+ }
370
+ const customToken = await createCustomToken(decoded.data.uid, {
371
+ emailVerified: decoded.data.email_verified,
372
+ source_sign_in_provider: decoded.data.firebase.sign_in_provider
373
+ });
374
+ const projectId = options.firebaseConfig?.projectId;
375
+ const appId = options.firebaseConfig?.appId;
376
+ if (!projectId || !appId) {
377
+ return { data: null, error: new Error("Project ID and App ID are required for App Check") };
378
+ }
379
+ const { accessToken } = await credential.getAccessToken();
380
+ const appCheckResponse = await options.apiClient?.appCheck.exchangeCustomToken({
381
+ accessToken,
382
+ projectId,
383
+ appId,
384
+ customToken,
385
+ limitedUse: false
386
+ });
387
+ if (!appCheckResponse?.token) {
388
+ return { data: null, error: new Error("Failed to exchange for App Check token") };
389
+ }
390
+ return {
391
+ data: {
392
+ token: appCheckResponse.token,
393
+ ttl: appCheckResponse.ttl
394
+ },
395
+ error: null
396
+ };
397
+ } catch (error) {
398
+ return { data: null, error };
399
+ }
400
+ }
240
401
  return {
241
402
  getUserData,
242
403
  customForIdAndRefreshToken,
243
404
  createCustomIdAndRefreshToken,
244
- refreshExpiredIdToken
405
+ refreshExpiredIdToken,
406
+ exchangeAppCheckToken
245
407
  };
246
408
  }
247
409
 
@@ -249,4 +411,4 @@ export {
249
411
  verifyToken,
250
412
  getAuth
251
413
  };
252
- //# sourceMappingURL=chunk-MS6L7M3C.mjs.map
414
+ //# sourceMappingURL=chunk-DJLDUW7J.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/keys.ts","../src/tokens/verify.ts","../src/auth/constants.ts","../src/auth/utils.ts","../src/auth/credential.ts","../src/auth/getauth.ts"],"sourcesContent":["import { type RemoteJWKSetOptions } from 'jose';\n\nimport {\n CACHE_CONTROL_REGEX,\n DEFAULT_CACHE_DURATION,\n GOOGLE_PUBLIC_KEYS_URL,\n MAX_CACHE_LAST_UPDATED_AT_SECONDS\n} from '../constants';\nimport { TokenVerificationError, TokenVerificationErrorReason } from '../utils/errors';\n\nexport type PublicKeys = { [key: string]: string };\n\ninterface PublicKeysResponse {\n keys: PublicKeys;\n expiresAt: number;\n}\n\nexport type LoadJWKFromRemoteOptions = RemoteJWKSetOptions & {\n kid: string;\n keyURL?: string;\n skipJwksCache?: boolean;\n};\n\ntype CertificateCache = Record<string, string>;\n\nlet cache: CertificateCache = {};\nlet lastUpdatedAt = 0;\nlet googleExpiresAt = 0;\n\nfunction getFromCache(kid: string) {\n return cache[kid];\n}\n\nfunction getCacheValues() {\n return Object.values(cache);\n}\n\nfunction setInCache(kid: string, certificate: string, shouldExpire = true) {\n cache[kid] = certificate;\n lastUpdatedAt = shouldExpire ? Date.now() : -1;\n}\n\nasync function fetchPublicKeys(keyUrl: string): Promise<PublicKeysResponse> {\n const url = new URL(keyUrl);\n const response = await fetch(url);\n if (!response.ok) {\n throw new TokenVerificationError({\n message: `Error loading public keys from ${url.href} with code=${response.status} `,\n reason: TokenVerificationErrorReason.TokenInvalid,\n });\n }\n\n const data = await response.json();\n const expiresAt = getExpiresAt(response);\n\n return {\n keys: data,\n expiresAt,\n };\n}\n\nexport async function loadJWKFromRemote({\n keyURL = GOOGLE_PUBLIC_KEYS_URL,\n skipJwksCache,\n kid,\n}: LoadJWKFromRemoteOptions): Promise<string> {\n if (skipJwksCache || isCacheExpired() || !getFromCache(kid)) {\n const { keys, expiresAt } = await fetchPublicKeys(keyURL);\n\n if (!keys || Object.keys(keys).length === 0) {\n throw new TokenVerificationError({\n message: `The JWKS endpoint ${keyURL} returned no keys`,\n reason: TokenVerificationErrorReason.RemoteJWKFailedToLoad,\n });\n }\n googleExpiresAt = expiresAt;\n\n Object.entries(keys).forEach(([keyId, cert]) => {\n setInCache(keyId, cert);\n });\n }\n const cert = getFromCache(kid);\n if (!cert) {\n getCacheValues();\n const availableKids = Object.keys(cache).sort().join(', ');\n\n throw new TokenVerificationError({\n message: `No public key found for kid \"${kid}\". Available kids: [${availableKids}]`,\n reason: TokenVerificationErrorReason.TokenInvalid,\n });\n }\n return cert;\n}\n\nfunction isCacheExpired() {\n const now = Date.now();\n if (lastUpdatedAt === -1) {\n return false;\n }\n\n const cacheAge = now - lastUpdatedAt;\n const maxCacheAge = MAX_CACHE_LAST_UPDATED_AT_SECONDS * 1000;\n const localCacheExpired = cacheAge >= maxCacheAge;\n const googleCacheExpired = now >= googleExpiresAt;\n\n const isExpired = localCacheExpired || googleCacheExpired;\n\n if (isExpired) {\n cache = {};\n }\n\n return isExpired;\n}\n\nfunction getExpiresAt(res: Response) {\n const cacheControlHeader = res.headers.get('cache-control');\n if (!cacheControlHeader) {\n return Date.now() + DEFAULT_CACHE_DURATION;\n }\n const maxAgeMatch = cacheControlHeader.match(CACHE_CONTROL_REGEX);\n const maxAge = maxAgeMatch ? parseInt(maxAgeMatch[1], 10) : DEFAULT_CACHE_DURATION / 1000;\n\n return Date.now() + maxAge * 1000;\n}\n\nexport const getCacheStats = () => ({\n localExpiry: lastUpdatedAt + MAX_CACHE_LAST_UPDATED_AT_SECONDS * 1000,\n googleExpiry: googleExpiresAt,\n cacheCount: Object.keys(cache).length,\n});\n","import type { DecodedIdToken, TernSecureAdminConfig, TernSecureConfig, TernSecureUserData} from '@tern-secure/types';\n\nimport type { JwtReturnType } from '../jwt/types';\nimport { ternDecodeJwt, verifyJwt, type VerifyJwtOptions } from '../jwt/verifyJwt';\nimport { TokenVerificationError, TokenVerificationErrorReason } from '../utils/errors';\nimport type { LoadJWKFromRemoteOptions } from './keys';\nimport { loadJWKFromRemote } from './keys';\n\nexport type VerifyTokenVOptions = Omit<VerifyJwtOptions, 'key'> & Omit<LoadJWKFromRemoteOptions, 'kid'> & {\n jwtKey?: string;\n};\n\nexport { TernSecureConfig, TernSecureAdminConfig, TernSecureUserData };\n\nexport async function verifyToken(\n token: string,\n options: VerifyTokenVOptions,\n): Promise<JwtReturnType<DecodedIdToken, TokenVerificationError>> {\n const { data: decodedResult, errors } = ternDecodeJwt(token);\n\n if (errors) {\n return { errors };\n }\n\n const { header } = decodedResult;\n const { kid } = header;\n\n if (!kid) {\n return {\n errors: [\n new TokenVerificationError({\n reason: TokenVerificationErrorReason.TokenInvalid,\n message: 'JWT \"kid\" header is missing.',\n }),\n ],\n };\n }\n\n try {\n const key = options.jwtKey || (await loadJWKFromRemote({ ...options, kid }));\n\n if (!key) {\n return {\n errors: [\n new TokenVerificationError({\n reason: TokenVerificationErrorReason.TokenInvalid,\n message: `No public key found for kid \"${kid}\".`,\n }),\n ],\n };\n }\n return await verifyJwt(token, { ...options, key });\n } catch (error) {\n if (error instanceof TokenVerificationError) {\n return { errors: [error] };\n }\n return {\n errors: [error as TokenVerificationError],\n };\n }\n}\n","export const TOKEN_EXPIRY_THRESHOLD_MILLIS = 5 * 60 * 1000;\nexport const GOOGLE_TOKEN_AUDIENCE = 'https://accounts.google.com/o/oauth2/token';\nexport const GOOGLE_AUTH_TOKEN_HOST = 'accounts.google.com';\nexport const GOOGLE_AUTH_TOKEN_PATH = '/o/oauth2/token';\nexport const ONE_HOUR_IN_SECONDS = 60 * 60;","async function getDetailFromResponse(response: Response): Promise<string> {\n const json = await response.json();\n\n if (!json) {\n return 'Missing error payload';\n }\n\n let detail =\n typeof json.error === 'string'\n ? json.error\n : (json.error?.message ?? 'Missing error payload');\n\n if (json.error_description) {\n detail += ' (' + json.error_description + ')';\n }\n\n return detail;\n}\n\nexport async function fetchJson(url: string, init: RequestInit) {\n return (await fetchAny(url, init)).json();\n}\n\nexport async function fetchAny(url: string, init: RequestInit) {\n const response = await fetch(url, init);\n\n if (!response.ok) {\n throw new Error(await getDetailFromResponse(response));\n }\n\n return response;\n}","import type { JWTPayload } from '@tern-secure/types';\n\nimport { ternSignJwt } from '../jwt';\nimport {\n GOOGLE_AUTH_TOKEN_HOST,\n GOOGLE_AUTH_TOKEN_PATH,\n GOOGLE_TOKEN_AUDIENCE,\n ONE_HOUR_IN_SECONDS,\n TOKEN_EXPIRY_THRESHOLD_MILLIS\n} from './constants'\nimport { fetchJson } from './utils';\n\n\nexport interface GoogleOAuthAccessToken {\n access_token: string;\n expires_in: number;\n}\n\nexport interface ServiceAccount {\n projectId: string;\n privateKey: string;\n clientEmail: string;\n}\n\nexport interface FirebaseAccessToken {\n accessToken: string;\n expirationTime: number;\n}\n\nconst accessTokenCache: Map<string, FirebaseAccessToken> = new Map();\n\nexport interface ServiceAccountCredential {\n getAccessToken: (refresh?: boolean) => Promise<FirebaseAccessToken>;\n}\n\nasync function requestAccessToken(urlString: string, init: RequestInit): Promise<FirebaseAccessToken> {\n const json = await fetchJson(urlString, init);\n\n if (!json.access_token || !json.expires_in) {\n throw new Error('Invalid access token response');\n }\n\n return {\n accessToken: json.access_token,\n expirationTime: Date.now() + (json.expires_in * 1000),\n }\n}\n\nexport class ServiceAccountTokenManager implements ServiceAccountCredential {\n private readonly projectId: string;\n private readonly privateKey: string;\n private readonly clientEmail: string;\n\n constructor(serviceAccount: ServiceAccount) {\n this.projectId = serviceAccount.projectId;\n this.privateKey = serviceAccount.privateKey;\n this.clientEmail = serviceAccount.clientEmail;\n }\n\n private fetchAccessToken = async (url: string): Promise<FirebaseAccessToken> => {\n const token = await this.createJwt();\n const postData =\n 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3A' +\n 'grant-type%3Ajwt-bearer&assertion=' +\n token;\n\n return requestAccessToken(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${token}`,\n Accept: 'application/json',\n },\n body: postData,\n })\n }\n\n private fetchAndCacheAccessToken = async (url: string): Promise<FirebaseAccessToken> => {\n const accessToken = await this.fetchAccessToken(url);\n accessTokenCache.set(this.projectId, accessToken);\n return accessToken;\n }\n\n public getAccessToken = async (refresh?: boolean): Promise<FirebaseAccessToken> => {\n const url = `https://${GOOGLE_AUTH_TOKEN_HOST}${GOOGLE_AUTH_TOKEN_PATH}`;\n\n if (refresh) {\n return this.fetchAndCacheAccessToken(url);\n }\n\n const cachedResponse = accessTokenCache.get(this.projectId);\n\n if (!cachedResponse || cachedResponse.expirationTime - Date.now() <= TOKEN_EXPIRY_THRESHOLD_MILLIS) {\n return this.fetchAndCacheAccessToken(url);\n }\n\n return cachedResponse;\n }\n\n private createJwt = async (): Promise<string> => {\n const iat = Math.floor(Date.now() / 1000);\n\n const payload = {\n aud: GOOGLE_TOKEN_AUDIENCE,\n iat,\n exp: iat + ONE_HOUR_IN_SECONDS,\n iss: this.clientEmail,\n sub: this.clientEmail,\n scope: [\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/firebase.database',\n 'https://www.googleapis.com/auth/firebase.messaging',\n 'https://www.googleapis.com/auth/identitytoolkit',\n 'https://www.googleapis.com/auth/userinfo.email'\n ].join(' ')\n } as JWTPayload;\n\n return ternSignJwt({\n payload,\n privateKey: this.privateKey,\n });\n }\n}\n","import { createCustomToken } from '../jwt/customJwt';\nimport type { AuthenticateRequestOptions, TernSecureUserData } from '../tokens/types';\nimport { verifyToken } from '../tokens/verify';\nimport { ServiceAccountTokenManager } from './credential';\n\nexport interface IdAndRefreshTokens {\n idToken: string;\n refreshToken: string;\n}\n\nexport interface CustomTokens {\n auth_time: number;\n idToken: string;\n refreshToken: string;\n customToken: string;\n}\n\ninterface CustomForIdAndRefreshTokenOptions {\n tenantId?: string;\n appCheckToken?: string;\n referer?: string;\n}\n\ninterface FirebaseRefreshTokenResponse {\n kind: string;\n id_token: string;\n refresh_token: string;\n expires_in: string;\n isNewUser: boolean;\n}\n\ntype AuthResult<T = any> = { data: T; error: null } | { data: null; error: any };\n\nconst API_KEY_ERROR = 'API Key is required';\nconst NO_DATA_ERROR = 'No token data received';\n\nfunction parseFirebaseResponse<T>(data: unknown): T {\n if (typeof data === 'string') {\n try {\n return JSON.parse(data) as T;\n } catch (error) {\n throw new Error(`Failed to parse Firebase response: ${error}`);\n }\n }\n return data as T;\n}\n\nexport function getAuth(options: AuthenticateRequestOptions) {\n const { apiKey, firebaseAdminConfig } = options;\n const firebaseApiKey = options.firebaseConfig?.apiKey;\n const effectiveApiKey = apiKey || firebaseApiKey;\n\n let credential: ServiceAccountTokenManager | null = null;\n if (\n firebaseAdminConfig?.projectId &&\n firebaseAdminConfig?.privateKey &&\n firebaseAdminConfig?.clientEmail\n ) {\n credential = new ServiceAccountTokenManager({\n projectId: firebaseAdminConfig.projectId,\n privateKey: firebaseAdminConfig.privateKey,\n clientEmail: firebaseAdminConfig.clientEmail,\n });\n }\n\n async function getUserData(idToken?: string, localId?: string): Promise<TernSecureUserData> {\n if (!effectiveApiKey) {\n throw new Error(API_KEY_ERROR);\n }\n const response = await options.apiClient?.userData.getUserData(effectiveApiKey, {\n idToken,\n localId,\n });\n\n if (!response?.data) {\n throw new Error(NO_DATA_ERROR);\n }\n\n const parsedData = parseFirebaseResponse<TernSecureUserData>(response.data);\n return parsedData;\n }\n\n async function refreshExpiredIdToken(\n refreshToken: string,\n opts: CustomForIdAndRefreshTokenOptions,\n ): Promise<AuthResult> {\n if (!effectiveApiKey) {\n return { data: null, error: new Error(API_KEY_ERROR) };\n }\n const response = await options.apiClient?.tokens.refreshToken(effectiveApiKey, {\n refresh_token: refreshToken,\n request_origin: opts.referer,\n });\n\n if (!response?.data) {\n return {\n data: null,\n error: new Error(NO_DATA_ERROR),\n };\n }\n\n const parsedData = parseFirebaseResponse<FirebaseRefreshTokenResponse>(response.data);\n\n return {\n data: {\n idToken: parsedData.id_token,\n refreshToken: parsedData.refresh_token,\n },\n error: null,\n };\n }\n\n async function customForIdAndRefreshToken(\n customToken: string,\n opts: CustomForIdAndRefreshTokenOptions,\n ): Promise<IdAndRefreshTokens> {\n if (!effectiveApiKey) {\n throw new Error('API Key is required to create custom token');\n }\n const data = await options.apiClient?.tokens.exchangeCustomForIdAndRefreshTokens(\n effectiveApiKey,\n {\n token: customToken,\n returnSecureToken: true,\n },\n {\n referer: opts.referer,\n appCheckToken: opts.appCheckToken,\n },\n );\n\n if (!data) {\n throw new Error('No data received from Firebase token exchange');\n }\n\n return {\n idToken: data.idToken,\n refreshToken: data.refreshToken,\n };\n }\n\n async function createCustomIdAndRefreshToken(\n idToken: string,\n opts: CustomForIdAndRefreshTokenOptions,\n ): Promise<CustomTokens> {\n const decoded = await verifyToken(idToken, options);\n const { data, errors } = decoded;\n if (errors) {\n throw errors[0];\n }\n\n //todo:\n /**\n * For sensitive applications, the auth_time should be checked before issuing the session cookie, minimizing the window of attack in case an ID token is stolen:\n */\n //if (new Date().getTime() / 1000 - data.auth_time < 5 * 60) {\n //proceed\n //}\n\n const customToken = await createCustomToken(data.uid, {\n emailVerified: data.email_verified,\n source_sign_in_provider: data.firebase.sign_in_provider,\n });\n\n const idAndRefreshTokens = await customForIdAndRefreshToken(customToken, {\n referer: opts.referer,\n appCheckToken: opts.appCheckToken,\n });\n\n const decodedCustomIdToken = await verifyToken(idAndRefreshTokens.idToken, options);\n if (decodedCustomIdToken.errors) {\n throw decodedCustomIdToken.errors[0];\n }\n\n return {\n ...idAndRefreshTokens,\n customToken,\n auth_time: decodedCustomIdToken.data.auth_time,\n };\n }\n\n async function exchangeAppCheckToken(idToken: string): Promise<AuthResult> {\n if (!credential) {\n return {\n data: null,\n error: new Error(\n 'Firebase Admin config must be provided to exchange App Check tokens.',\n ),\n };\n }\n if (!effectiveApiKey) {\n return { data: null, error: new Error(API_KEY_ERROR) };\n }\n\n try {\n const decoded = await verifyToken(idToken, options);\n if (decoded.errors) {\n return { data: null, error: decoded.errors[0] };\n }\n\n const customToken = await createCustomToken(decoded.data.uid, {\n emailVerified: decoded.data.email_verified,\n source_sign_in_provider: decoded.data.firebase.sign_in_provider,\n });\n\n const projectId = options.firebaseConfig?.projectId;\n const appId = options.firebaseConfig?.appId;\n\n if (!projectId || !appId) {\n return { data: null, error: new Error('Project ID and App ID are required for App Check') };\n }\n\n const { accessToken } = await credential.getAccessToken();\n\n const appCheckResponse = await options.apiClient?.appCheck.exchangeCustomToken({\n accessToken,\n projectId,\n appId,\n customToken,\n limitedUse: false,\n });\n\n if (!appCheckResponse?.token) {\n return { data: null, error: new Error('Failed to exchange for App Check token') };\n }\n\n return {\n data: {\n token: appCheckResponse.token,\n ttl: appCheckResponse.ttl\n },\n error: null,\n };\n } catch (error) {\n return { data: null, error };\n }\n }\n\n return {\n getUserData,\n customForIdAndRefreshToken,\n createCustomIdAndRefreshToken,\n refreshExpiredIdToken,\n exchangeAppCheckToken,\n };\n}\n"],"mappings":"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","names":["cert"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  constants
3
- } from "./chunk-DFAJCSBJ.mjs";
3
+ } from "./chunk-WIVOBOZR.mjs";
4
4
 
5
5
  // src/tokens/ternSecureRequest.ts
6
6
  import { parse } from "cookie";
@@ -68,4 +68,4 @@ var createTernSecureRequest = (...args) => {
68
68
  export {
69
69
  createTernSecureRequest
70
70
  };
71
- //# sourceMappingURL=chunk-ASGV4MFO.mjs.map
71
+ //# sourceMappingURL=chunk-GFH5CXQR.mjs.map