firebase-admin-edge 1.0.1 → 1.0.4

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 (77) hide show
  1. package/dist/auth/cookie-types.d.ts +19 -0
  2. package/dist/auth/cookie-types.d.ts.map +1 -0
  3. package/dist/auth/cookie-types.js +2 -0
  4. package/dist/auth/cookie-types.js.map +1 -0
  5. package/dist/auth/firebase-admin-auth.d.ts +84 -0
  6. package/dist/auth/firebase-admin-auth.d.ts.map +1 -0
  7. package/dist/auth/firebase-admin-auth.js +196 -0
  8. package/dist/auth/firebase-admin-auth.js.map +1 -0
  9. package/dist/auth/firebase-admin-auth.test.d.ts +2 -0
  10. package/dist/auth/firebase-admin-auth.test.d.ts.map +1 -0
  11. package/dist/auth/firebase-admin-auth.test.js +445 -0
  12. package/dist/auth/firebase-admin-auth.test.js.map +1 -0
  13. package/dist/auth/firebase-auth-endpoints.d.ts +101 -0
  14. package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -0
  15. package/dist/auth/firebase-auth-endpoints.js +134 -0
  16. package/dist/auth/firebase-auth-endpoints.js.map +1 -0
  17. package/dist/auth/firebase-auth-endpoints.test.d.ts +2 -0
  18. package/dist/auth/firebase-auth-endpoints.test.d.ts.map +1 -0
  19. package/dist/auth/firebase-auth-endpoints.test.js +259 -0
  20. package/dist/auth/firebase-auth-endpoints.test.js.map +1 -0
  21. package/dist/auth/firebase-auth.d.ts +43 -0
  22. package/dist/auth/firebase-auth.d.ts.map +1 -0
  23. package/dist/auth/firebase-auth.js +48 -0
  24. package/dist/auth/firebase-auth.js.map +1 -0
  25. package/dist/auth/firebase-auth.test.d.ts +2 -0
  26. package/dist/auth/firebase-auth.test.d.ts.map +1 -0
  27. package/dist/auth/firebase-auth.test.js +97 -0
  28. package/dist/auth/firebase-auth.test.js.map +1 -0
  29. package/dist/auth/firebase-jwt.d.ts +57 -0
  30. package/dist/auth/firebase-jwt.d.ts.map +1 -0
  31. package/dist/auth/firebase-jwt.js +275 -0
  32. package/dist/auth/firebase-jwt.js.map +1 -0
  33. package/dist/auth/firebase-jwt.test.d.ts +2 -0
  34. package/dist/auth/firebase-jwt.test.d.ts.map +1 -0
  35. package/dist/auth/firebase-jwt.test.js +144 -0
  36. package/dist/auth/firebase-jwt.test.js.map +1 -0
  37. package/dist/auth/firebase-types.d.ts +152 -0
  38. package/dist/auth/firebase-types.d.ts.map +1 -0
  39. package/dist/auth/firebase-types.js +2 -0
  40. package/dist/auth/firebase-types.js.map +1 -0
  41. package/dist/auth/google-oauth.d.ts +32 -0
  42. package/dist/auth/google-oauth.d.ts.map +1 -0
  43. package/dist/auth/google-oauth.js +93 -0
  44. package/dist/auth/google-oauth.js.map +1 -0
  45. package/dist/auth/google-oauth.test.d.ts +2 -0
  46. package/dist/auth/google-oauth.test.d.ts.map +1 -0
  47. package/dist/auth/google-oauth.test.js +124 -0
  48. package/dist/auth/google-oauth.test.js.map +1 -0
  49. package/dist/firebase-edge-server.d.ts +102 -0
  50. package/dist/firebase-edge-server.d.ts.map +1 -0
  51. package/dist/firebase-edge-server.js +184 -0
  52. package/dist/firebase-edge-server.js.map +1 -0
  53. package/dist/firebase-edge-server.test.d.ts +2 -0
  54. package/dist/firebase-edge-server.test.d.ts.map +1 -0
  55. package/dist/firebase-edge-server.test.js +164 -0
  56. package/dist/firebase-edge-server.test.js.map +1 -0
  57. package/dist/index.d.ts +4 -1
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +4 -1
  60. package/dist/index.js.map +1 -1
  61. package/dist/rest-fetch.d.ts +18 -0
  62. package/dist/rest-fetch.d.ts.map +1 -0
  63. package/dist/rest-fetch.js +57 -0
  64. package/dist/rest-fetch.js.map +1 -0
  65. package/dist/rest-fetch.test.d.ts +2 -0
  66. package/dist/rest-fetch.test.d.ts.map +1 -0
  67. package/dist/rest-fetch.test.js +152 -0
  68. package/dist/rest-fetch.test.js.map +1 -0
  69. package/package.json +6 -2
  70. package/dist/utils.d.ts +0 -2
  71. package/dist/utils.d.ts.map +0 -1
  72. package/dist/utils.js +0 -2
  73. package/dist/utils.js.map +0 -1
  74. package/dist/utils.test.d.ts +0 -2
  75. package/dist/utils.test.d.ts.map +0 -1
  76. package/dist/utils.test.js +0 -6
  77. package/dist/utils.test.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ import { JOSEError } from 'jose/errors';
2
+ import type { FirebaseIdTokenPayload, ServiceAccount } from './firebase-types.js';
3
+ type SignJwtResult = {
4
+ data: string;
5
+ error: null;
6
+ } | {
7
+ data: null;
8
+ error: JOSEError | Error | {
9
+ message: string;
10
+ };
11
+ };
12
+ export declare function verifySessionJWT(sessionCookie: string, projectId: string, fetchFn?: typeof globalThis.fetch): Promise<{
13
+ data: null;
14
+ error: {
15
+ code: number;
16
+ message: string;
17
+ errors?: {
18
+ message: string;
19
+ domain: string;
20
+ reason: string;
21
+ }[];
22
+ };
23
+ } | {
24
+ data: null;
25
+ error: Error;
26
+ } | {
27
+ error: null;
28
+ data: FirebaseIdTokenPayload;
29
+ }>;
30
+ export declare function verifyJWT(idToken: string, projectId: string, fetchFn?: typeof globalThis.fetch): Promise<{
31
+ error: Error;
32
+ data: null;
33
+ } | {
34
+ error: {
35
+ code: number;
36
+ message: string;
37
+ errors?: {
38
+ message: string;
39
+ domain: string;
40
+ reason: string;
41
+ }[];
42
+ };
43
+ data: null;
44
+ } | {
45
+ error: null;
46
+ data: FirebaseIdTokenPayload;
47
+ }>;
48
+ export declare function signJWT(serviceAccount: ServiceAccount): Promise<SignJwtResult>;
49
+ export declare function signJWTCustomToken(uid: string, serviceAccount: ServiceAccount, additionalClaims?: object): Promise<{
50
+ data: null;
51
+ error: Error;
52
+ } | {
53
+ data: string;
54
+ error: null;
55
+ }>;
56
+ export {};
57
+ //# sourceMappingURL=firebase-jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-jwt.d.ts","sourceRoot":"","sources":["../../src/auth/firebase-jwt.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,SAAS,EAMZ,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACR,sBAAsB,EACtB,cAAc,EACjB,MAAM,qBAAqB,CAAC;AAoC7B,KAAK,aAAa,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAC7B;IACI,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD,CAAC;AAER,wBAAsB,gBAAgB,CAClC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB;;;;;;;;;;;;;;;;UAwD1B,sBAAsB;GAoClD;AAED,wBAAsB,SAAS,CAC3B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK;;;;;;;;;;;;;;;;UA6CR,sBAAsB;GAoClD;AAED,wBAAsB,OAAO,CACzB,cAAc,EAAE,cAAc,GAC/B,OAAO,CAAC,aAAa,CAAC,CAsDxB;AAsBD,wBAAsB,kBAAkB,CACpC,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,gBAAgB,GAAE,MAAW;;;;;;GAsDhC"}
@@ -0,0 +1,275 @@
1
+ import { decodeProtectedHeader, errors, jwtVerify, importPKCS8, SignJWT, importX509, importSPKI, } from 'jose';
2
+ import { JOSEError, JWSInvalid, JWSSignatureVerificationFailed, JWTClaimValidationFailed, JWTExpired, JWTInvalid, } from 'jose/errors';
3
+ import { getJWKs, getPublicKeys } from './firebase-auth-endpoints.js';
4
+ const ALGORITHM_RS256 = 'RS256';
5
+ const OAUTH_TOKEN_URL = 'https://oauth2.googleapis.com/token';
6
+ const SCOPES = [
7
+ 'https://www.googleapis.com/auth/datastore',
8
+ 'https://www.googleapis.com/auth/identitytoolkit',
9
+ 'https://www.googleapis.com/auth/devstorage.read_write',
10
+ 'https://www.googleapis.com/auth/devstorage.read_write',
11
+ ];
12
+ const keyMap = new Map();
13
+ async function importPublicCryptoKey(publicKey) {
14
+ if (publicKey.startsWith('-----BEGIN CERTIFICATE-----')) {
15
+ return importX509(publicKey, ALGORITHM_RS256);
16
+ }
17
+ return importSPKI(publicKey, ALGORITHM_RS256);
18
+ }
19
+ async function getPublicCryptoKey(publicKey) {
20
+ const cachedKey = keyMap.get(publicKey);
21
+ if (cachedKey) {
22
+ return cachedKey;
23
+ }
24
+ const key = await importPublicCryptoKey(publicKey);
25
+ keyMap.set(publicKey, key);
26
+ return key;
27
+ }
28
+ export async function verifySessionJWT(sessionCookie, projectId, fetchFn = globalThis.fetch) {
29
+ try {
30
+ const { data: keyData, error } = await getPublicKeys(fetchFn);
31
+ if (error) {
32
+ return {
33
+ data: null,
34
+ error,
35
+ };
36
+ }
37
+ if (!keyData) {
38
+ return {
39
+ data: null,
40
+ error: new Error('No public keys retrieved'),
41
+ };
42
+ }
43
+ // Decode header to get kid
44
+ const header = decodeProtectedHeader(sessionCookie);
45
+ if (!header.kid ||
46
+ typeof header.kid !== 'string' ||
47
+ !keyData[header.kid]) {
48
+ return {
49
+ error: new Error('Invalid session cookie: no KID found'),
50
+ data: null,
51
+ };
52
+ }
53
+ const publicKeyString = keyData[header.kid];
54
+ if (!publicKeyString) {
55
+ return {
56
+ error: new Error('No public key found for the given KID'),
57
+ data: null,
58
+ };
59
+ }
60
+ const expectedIssuer = `https://session.firebase.google.com/${projectId}`;
61
+ const expectedAudience = projectId;
62
+ // Non-emulator: verify with jose
63
+ const publicKey = await getPublicCryptoKey(publicKeyString);
64
+ const { payload } = await jwtVerify(sessionCookie, publicKey, {
65
+ issuer: expectedIssuer,
66
+ audience: expectedAudience,
67
+ algorithms: [ALGORITHM_RS256],
68
+ });
69
+ return {
70
+ error: null,
71
+ data: payload,
72
+ };
73
+ }
74
+ catch (err) {
75
+ if (err instanceof JWTExpired) {
76
+ return {
77
+ error: new Error('JWT has expired'),
78
+ data: null,
79
+ };
80
+ }
81
+ if (err instanceof JWTClaimValidationFailed) {
82
+ return {
83
+ error: new Error(`JWT claim validation failed: ${err.message}`),
84
+ data: null,
85
+ };
86
+ }
87
+ if (err instanceof JWSInvalid ||
88
+ err instanceof JWSSignatureVerificationFailed) {
89
+ return {
90
+ error: new Error('JWT signature verification failed'),
91
+ data: null,
92
+ };
93
+ }
94
+ return {
95
+ error: new Error(err instanceof Error
96
+ ? err.message
97
+ : 'Unknown error during JWT verification'),
98
+ data: null,
99
+ };
100
+ }
101
+ }
102
+ export async function verifyJWT(idToken, projectId, fetchFn) {
103
+ try {
104
+ const { kid } = decodeProtectedHeader(idToken);
105
+ if (!kid) {
106
+ return {
107
+ error: new Error('Invalid ID token: no KID found'),
108
+ data: null,
109
+ };
110
+ }
111
+ const { data, error } = await getJWKs(fetchFn);
112
+ if (error) {
113
+ return {
114
+ error,
115
+ data: null,
116
+ };
117
+ }
118
+ if (!data || !data.length) {
119
+ return {
120
+ error: new Error('No JWKs retrieved'),
121
+ data: null,
122
+ };
123
+ }
124
+ const jwk = data.find((key) => key.kid === kid);
125
+ if (!jwk) {
126
+ return {
127
+ error: new Error(`No matching JWK found for KID: ${kid}`),
128
+ data: null,
129
+ };
130
+ }
131
+ const { payload } = await jwtVerify(idToken, jwk, {
132
+ issuer: `https://securetoken.google.com/${projectId}`,
133
+ audience: projectId,
134
+ algorithms: ['RS256'],
135
+ });
136
+ return {
137
+ error: null,
138
+ data: payload,
139
+ };
140
+ }
141
+ catch (err) {
142
+ if (err instanceof JWTExpired) {
143
+ return {
144
+ error: new Error('JWT has expired'),
145
+ data: null,
146
+ };
147
+ }
148
+ if (err instanceof JWTClaimValidationFailed) {
149
+ return {
150
+ error: new Error(`JWT claim validation failed: ${err.message}`),
151
+ data: null,
152
+ };
153
+ }
154
+ if (err instanceof JWTInvalid ||
155
+ err instanceof JWSSignatureVerificationFailed) {
156
+ return {
157
+ error: new Error('JWT signature verification failed'),
158
+ data: null,
159
+ };
160
+ }
161
+ return {
162
+ error: new Error(err instanceof Error
163
+ ? err.message
164
+ : 'Unknown error during JWT verification'),
165
+ data: null,
166
+ };
167
+ }
168
+ }
169
+ export async function signJWT(serviceAccount) {
170
+ const { private_key, client_email } = serviceAccount;
171
+ try {
172
+ // Normalize Firebase JSON private key
173
+ const normalizedKey = private_key.replace(/\\n/g, '\n');
174
+ let key;
175
+ try {
176
+ // NOTE: we don't type this as KeyLike, just let jose's type defs handle it
177
+ key = await importPKCS8(normalizedKey, ALGORITHM_RS256);
178
+ }
179
+ catch (e) {
180
+ return {
181
+ data: null,
182
+ error: new Error('Failed to import private key. Please ensure the private key is correctly formatted.'),
183
+ };
184
+ }
185
+ const now = Math.floor(Date.now() / 1000);
186
+ const payload = {
187
+ scope: SCOPES.join(' '),
188
+ iss: client_email,
189
+ sub: client_email,
190
+ aud: OAUTH_TOKEN_URL,
191
+ iat: now,
192
+ exp: now + 3600, // 1 hour
193
+ };
194
+ const token = await new SignJWT(payload)
195
+ .setProtectedHeader({ alg: ALGORITHM_RS256, typ: 'JWT' })
196
+ .sign(key);
197
+ return {
198
+ data: token,
199
+ error: null,
200
+ };
201
+ }
202
+ catch (e) {
203
+ if (e instanceof JOSEError) {
204
+ return { data: null, error: e };
205
+ }
206
+ if (e instanceof Error) {
207
+ return { data: null, error: e };
208
+ }
209
+ return {
210
+ data: null,
211
+ error: new Error('Unknown error during JWT signing'),
212
+ };
213
+ }
214
+ }
215
+ const RESERVED_CLAIMS = [
216
+ 'acr',
217
+ 'amr',
218
+ 'at_hash',
219
+ 'aud',
220
+ 'auth_time',
221
+ 'azp',
222
+ 'cnf',
223
+ 'c_hash',
224
+ 'exp',
225
+ 'iat',
226
+ 'iss',
227
+ 'jti',
228
+ 'nbf',
229
+ 'nonce',
230
+ 'sub',
231
+ 'firebase',
232
+ 'user_id',
233
+ ];
234
+ export async function signJWTCustomToken(uid, serviceAccount, additionalClaims = {}) {
235
+ const { private_key, client_email } = serviceAccount;
236
+ if (Object.keys(additionalClaims).some((k) => RESERVED_CLAIMS.includes(k) || k.startsWith('firebase'))) {
237
+ return {
238
+ data: null,
239
+ error: new Error(`Reserved claims (${RESERVED_CLAIMS.join(', ')}) cannot be used in additionalClaims`),
240
+ };
241
+ }
242
+ const payload = { uid };
243
+ if (Object.keys(additionalClaims).length) {
244
+ payload.claims = additionalClaims;
245
+ }
246
+ const url = 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit';
247
+ try {
248
+ const key = await importPKCS8(private_key, 'RS256');
249
+ const token = await new SignJWT(payload)
250
+ .setProtectedHeader({ alg: 'RS256', typ: 'JWT' })
251
+ .setIssuer(client_email)
252
+ .setSubject(client_email)
253
+ .setAudience(url)
254
+ .setIssuedAt()
255
+ .setExpirationTime('1h')
256
+ .sign(key);
257
+ return {
258
+ data: token,
259
+ error: null,
260
+ };
261
+ }
262
+ catch (e) {
263
+ if (e instanceof errors.JOSEError) {
264
+ return {
265
+ data: null,
266
+ error: e,
267
+ };
268
+ }
269
+ return {
270
+ data: null,
271
+ error: e,
272
+ };
273
+ }
274
+ }
275
+ //# sourceMappingURL=firebase-jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-jwt.js","sourceRoot":"","sources":["../../src/auth/firebase-jwt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=firebase-jwt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-jwt.test.d.ts","sourceRoot":"","sources":["../../src/auth/firebase-jwt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,144 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { verifySessionJWT, verifyJWT, signJWT, signJWTCustomToken, } from './firebase-jwt.js';
3
+ import * as firebaseAuthEndpoints from './firebase-auth-endpoints.js';
4
+ vi.mock('./firebase-auth-endpoints');
5
+ describe('firebase-jwt', () => {
6
+ const mockProjectId = 'test-project-id';
7
+ const mockServiceAccount = {
8
+ type: 'service_account',
9
+ project_id: mockProjectId,
10
+ private_key_id: 'mock-private-key-id',
11
+ private_key: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC\n-----END PRIVATE KEY-----',
12
+ client_email: 'test@test-project.iam.gserviceaccount.com',
13
+ client_id: 'mock-client-id',
14
+ auth_uri: 'https://accounts.google.com/o/oauth2/auth',
15
+ token_uri: 'https://oauth2.googleapis.com/token',
16
+ auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs',
17
+ client_x509_cert_url: 'https://www.googleapis.com/robot/v1/metadata/x509/test%40test-project.iam.gserviceaccount.com',
18
+ };
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ });
22
+ describe('verifySessionJWT', () => {
23
+ it('should return error when no public keys retrieved', async () => {
24
+ vi.spyOn(firebaseAuthEndpoints, 'getPublicKeys').mockResolvedValue({
25
+ data: null,
26
+ error: { code: 500, message: 'Failed to fetch keys' },
27
+ });
28
+ const result = await verifySessionJWT('invalid-token', mockProjectId);
29
+ expect(result.error).toBeDefined();
30
+ expect(result.data).toBeNull();
31
+ });
32
+ it('should return error when keyData is null', async () => {
33
+ vi.spyOn(firebaseAuthEndpoints, 'getPublicKeys').mockResolvedValue({
34
+ data: null,
35
+ error: null,
36
+ });
37
+ const result = await verifySessionJWT('invalid-token', mockProjectId);
38
+ expect(result.error).toEqual(new Error('No public keys retrieved'));
39
+ expect(result.data).toBeNull();
40
+ });
41
+ it('should return error when token has no KID', async () => {
42
+ vi.spyOn(firebaseAuthEndpoints, 'getPublicKeys').mockResolvedValue({
43
+ data: { key1: 'public-key' },
44
+ error: null,
45
+ });
46
+ const result = await verifySessionJWT('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.invalid', mockProjectId);
47
+ expect(result.error?.message).toContain('Invalid session cookie');
48
+ expect(result.data).toBeNull();
49
+ });
50
+ it('should return error when public key not found for KID', async () => {
51
+ vi.spyOn(firebaseAuthEndpoints, 'getPublicKeys').mockResolvedValue({
52
+ data: { key1: 'public-key' },
53
+ error: null,
54
+ });
55
+ const result = await verifySessionJWT('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleTIifQ.eyJzdWIiOiIxMjM0NTY3ODkwIn0.invalid', mockProjectId);
56
+ expect(result.error?.message).toContain('Invalid session cookie');
57
+ expect(result.data).toBeNull();
58
+ });
59
+ });
60
+ describe('verifyJWT', () => {
61
+ it('should return error when token has no KID', async () => {
62
+ const result = await verifyJWT('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.invalid', mockProjectId);
63
+ expect(result.error?.message).toContain('Invalid ID token: no KID found');
64
+ expect(result.data).toBeNull();
65
+ });
66
+ it('should return error when getJWKs fails', async () => {
67
+ vi.spyOn(firebaseAuthEndpoints, 'getJWKs').mockResolvedValue({
68
+ data: null,
69
+ error: { code: 500, message: 'Network error' },
70
+ });
71
+ const result = await verifyJWT('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleTEifQ.eyJzdWIiOiIxMjM0NTY3ODkwIn0.invalid', mockProjectId);
72
+ expect(result.error).toBeDefined();
73
+ expect(result.data).toBeNull();
74
+ });
75
+ it('should return error when no JWKs retrieved', async () => {
76
+ vi.spyOn(firebaseAuthEndpoints, 'getJWKs').mockResolvedValue({
77
+ data: null,
78
+ error: null,
79
+ });
80
+ const result = await verifyJWT('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleTEifQ.eyJzdWIiOiIxMjM0NTY3ODkwIn0.invalid', mockProjectId);
81
+ expect(result.error?.message).toBe('No JWKs retrieved');
82
+ expect(result.data).toBeNull();
83
+ });
84
+ it('should return error when no matching JWK found', async () => {
85
+ vi.spyOn(firebaseAuthEndpoints, 'getJWKs').mockResolvedValue({
86
+ data: [{ kid: 'different-key', kty: 'RSA' }],
87
+ error: null,
88
+ });
89
+ const result = await verifyJWT('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleTEifQ.eyJzdWIiOiIxMjM0NTY3ODkwIn0.invalid', mockProjectId);
90
+ expect(result.error?.message).toContain('No matching JWK found');
91
+ expect(result.data).toBeNull();
92
+ });
93
+ });
94
+ describe('signJWT', () => {
95
+ it('should return error when private key is invalid', async () => {
96
+ const invalidServiceAccount = {
97
+ ...mockServiceAccount,
98
+ private_key: 'invalid-key',
99
+ };
100
+ const result = await signJWT(invalidServiceAccount);
101
+ expect(result.error?.message).toContain('Failed to import private key');
102
+ expect(result.data).toBeNull();
103
+ });
104
+ it('should handle escaped newlines in private key', async () => {
105
+ const serviceAccountWithEscaped = {
106
+ ...mockServiceAccount,
107
+ private_key: mockServiceAccount.private_key.replace(/\n/g, '\\n'),
108
+ };
109
+ const result = await signJWT(serviceAccountWithEscaped);
110
+ expect(result.error).toBeDefined();
111
+ });
112
+ });
113
+ describe('signJWTCustomToken', () => {
114
+ const uid = 'test-uid-123';
115
+ it('should return error when reserved claims are used', async () => {
116
+ const result = await signJWTCustomToken(uid, mockServiceAccount, {
117
+ aud: 'reserved',
118
+ });
119
+ expect(result.error?.message).toContain('Reserved claims');
120
+ expect(result.data).toBeNull();
121
+ });
122
+ it('should return error when firebase prefixed claims are used', async () => {
123
+ const result = await signJWTCustomToken(uid, mockServiceAccount, {
124
+ firebase_custom: 'value',
125
+ });
126
+ expect(result.error?.message).toContain('Reserved claims');
127
+ expect(result.data).toBeNull();
128
+ });
129
+ it('should return error with invalid private key', async () => {
130
+ const invalidServiceAccount = {
131
+ ...mockServiceAccount,
132
+ private_key: 'invalid-key',
133
+ };
134
+ const result = await signJWTCustomToken(uid, invalidServiceAccount, {});
135
+ expect(result.error).toBeDefined();
136
+ expect(result.data).toBeNull();
137
+ });
138
+ it('should accept empty additional claims', async () => {
139
+ const result = await signJWTCustomToken(uid, mockServiceAccount);
140
+ expect(result.error).toBeDefined();
141
+ });
142
+ });
143
+ });
144
+ //# sourceMappingURL=firebase-jwt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-jwt.test.js","sourceRoot":"","sources":["../../src/auth/firebase-jwt.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ export type FirebaseRestError = {
2
+ error: {
3
+ code: number;
4
+ message: string;
5
+ errors?: {
6
+ message: string;
7
+ domain: string;
8
+ reason: string;
9
+ }[];
10
+ };
11
+ };
12
+ export type FirebaseConfig = {
13
+ apiKey: string;
14
+ authDomain: string;
15
+ projectId: string;
16
+ storageBucket?: string;
17
+ messagingSenderId?: string;
18
+ appId?: string;
19
+ measurementId?: string;
20
+ };
21
+ export type FirebaseCreateAuthUriResponse = {
22
+ authUri: string;
23
+ registered?: boolean;
24
+ providerId?: string;
25
+ allProviders?: string[];
26
+ signinMethods?: string[];
27
+ sessionId?: string;
28
+ };
29
+ export type FirebaseIdpSignInResponse = {
30
+ idToken: string;
31
+ refreshToken: string;
32
+ expiresIn: string;
33
+ localId: string;
34
+ email?: string;
35
+ emailVerified?: boolean;
36
+ providerId: string;
37
+ federatedId: string;
38
+ oauthIdToken?: string;
39
+ rawUserInfo?: string;
40
+ };
41
+ export type GoogleTokenResponse = {
42
+ access_token: string;
43
+ expires_in: number;
44
+ refresh_token?: string;
45
+ scope: string;
46
+ token_type: 'Bearer';
47
+ id_token: string;
48
+ };
49
+ export type FirebaseRefreshTokenResponse = {
50
+ access_token: string;
51
+ expires_in: string;
52
+ token_type: 'Bearer';
53
+ refresh_token: string;
54
+ id_token: string;
55
+ user_id: string;
56
+ project_id: string;
57
+ };
58
+ export type FirebaseIdTokenPayload = {
59
+ iss: string;
60
+ aud: string;
61
+ auth_time: number;
62
+ user_id: string;
63
+ sub: string;
64
+ iat: number;
65
+ exp: number;
66
+ email?: string;
67
+ email_verified?: boolean;
68
+ firebase: {
69
+ identities: {
70
+ email?: string[];
71
+ 'google.com'?: string[];
72
+ [provider: string]: string[] | undefined;
73
+ };
74
+ sign_in_provider: string;
75
+ tenant?: string;
76
+ };
77
+ uid?: string;
78
+ name?: string;
79
+ picture?: string;
80
+ };
81
+ export interface UserMetadata {
82
+ creationTime: string;
83
+ lastSignInTime: string;
84
+ lastRefreshTime?: string;
85
+ }
86
+ export interface UserInfo {
87
+ uid: string;
88
+ displayName?: string;
89
+ email?: string;
90
+ photoURL?: string;
91
+ phoneNumber?: string;
92
+ providerId: string;
93
+ }
94
+ export type CustomClaims = Record<string, string | number | boolean | null>;
95
+ export interface UserRecord {
96
+ uid: string;
97
+ email?: string;
98
+ emailVerified: boolean;
99
+ displayName?: string;
100
+ photoURL?: string;
101
+ phoneNumber?: string;
102
+ disabled: boolean;
103
+ metadata: UserMetadata;
104
+ providerData: UserInfo[];
105
+ tokensValidAfterTime?: string;
106
+ tenantId?: string;
107
+ customClaims?: {
108
+ [key: string]: CustomClaims;
109
+ };
110
+ }
111
+ export interface ServiceAccount {
112
+ type: 'service_account';
113
+ project_id: string;
114
+ private_key_id: string;
115
+ private_key: string;
116
+ client_email: string;
117
+ client_id: string;
118
+ auth_uri: string;
119
+ token_uri: string;
120
+ auth_provider_x509_cert_url: string;
121
+ client_x509_cert_url: string;
122
+ universe_domain?: string;
123
+ }
124
+ export interface AccountsQueryResponse {
125
+ recordsCount: string;
126
+ userInfo: UserInfo[];
127
+ }
128
+ export interface UserInfo {
129
+ localId: string;
130
+ email?: string;
131
+ displayName?: string;
132
+ photoUrl?: string;
133
+ emailVerified?: boolean;
134
+ providerUserInfo?: ProviderUserInfo[];
135
+ validSince?: string;
136
+ lastLoginAt?: string;
137
+ createdAt?: string;
138
+ customAttributes?: string;
139
+ emailLinkSignin?: boolean;
140
+ initialEmail?: string;
141
+ lastRefreshAt?: string;
142
+ disabled?: boolean;
143
+ }
144
+ export interface ProviderUserInfo {
145
+ providerId: string;
146
+ rawId?: string;
147
+ email?: string;
148
+ displayName?: string;
149
+ photoUrl?: string;
150
+ federatedId?: string;
151
+ }
152
+ //# sourceMappingURL=firebase-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-types.d.ts","sourceRoot":"","sources":["../../src/auth/firebase-types.ts"],"names":[],"mappings":"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"}