firebase-admin-edge 1.0.18 → 1.0.20
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/README.md +26 -0
- package/dist/auth/auth-endpoint-errors.d.ts +15 -0
- package/dist/auth/auth-endpoint-errors.d.ts.map +1 -0
- package/dist/auth/auth-endpoint-errors.js +120 -0
- package/dist/auth/auth-endpoint-errors.js.map +1 -0
- package/dist/auth/auth-error-codes.d.ts +777 -0
- package/dist/auth/auth-error-codes.d.ts.map +1 -0
- package/dist/auth/auth-error-codes.js +823 -0
- package/dist/auth/auth-error-codes.js.map +1 -0
- package/dist/auth/errors.d.ts +20 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +29 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/firebase-admin-auth.d.ts +12 -21
- package/dist/auth/firebase-admin-auth.d.ts.map +1 -1
- package/dist/auth/firebase-admin-auth.js +54 -16
- package/dist/auth/firebase-admin-auth.js.map +1 -1
- package/dist/auth/firebase-admin-auth.test.js +36 -24
- package/dist/auth/firebase-admin-auth.test.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.d.ts +13 -77
- package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -1
- package/dist/auth/firebase-auth-endpoints.js +53 -37
- package/dist/auth/firebase-auth-endpoints.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.test.js +178 -13
- package/dist/auth/firebase-auth-endpoints.test.js.map +1 -1
- package/dist/auth/firebase-auth.d.ts +5 -9
- package/dist/auth/firebase-auth.d.ts.map +1 -1
- package/dist/auth/firebase-auth.js +61 -21
- package/dist/auth/firebase-auth.js.map +1 -1
- package/dist/auth/firebase-auth.test.js +29 -12
- package/dist/auth/firebase-auth.test.js.map +1 -1
- package/dist/auth/firebase-jwt.d.ts +5 -29
- package/dist/auth/firebase-jwt.d.ts.map +1 -1
- package/dist/auth/firebase-jwt.js +74 -33
- package/dist/auth/firebase-jwt.js.map +1 -1
- package/dist/auth/firebase-jwt.test.js +31 -11
- package/dist/auth/firebase-jwt.test.js.map +1 -1
- package/dist/auth/github-oauth.d.ts +5 -2
- package/dist/auth/github-oauth.d.ts.map +1 -1
- package/dist/auth/github-oauth.js +126 -13
- package/dist/auth/github-oauth.js.map +1 -1
- package/dist/auth/github-oauth.test.d.ts +2 -0
- package/dist/auth/github-oauth.test.d.ts.map +1 -0
- package/dist/auth/github-oauth.test.js +202 -0
- package/dist/auth/github-oauth.test.js.map +1 -0
- package/dist/auth/google-oauth.d.ts +3 -3
- package/dist/auth/google-oauth.d.ts.map +1 -1
- package/dist/auth/google-oauth.js +89 -26
- package/dist/auth/google-oauth.js.map +1 -1
- package/dist/auth/google-oauth.test.js +105 -35
- package/dist/auth/google-oauth.test.js.map +1 -1
- package/dist/auth/oauth.d.ts +3 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +28 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/oauth.test.d.ts +2 -0
- package/dist/auth/oauth.test.d.ts.map +1 -0
- package/dist/auth/oauth.test.js +233 -0
- package/dist/auth/oauth.test.js.map +1 -0
- package/dist/firebase-edge-errors.d.ts +95 -0
- package/dist/firebase-edge-errors.d.ts.map +1 -0
- package/dist/firebase-edge-errors.js +102 -0
- package/dist/firebase-edge-errors.js.map +1 -0
- package/dist/firebase-edge-errors.test.d.ts +2 -0
- package/dist/firebase-edge-errors.test.d.ts.map +1 -0
- package/dist/firebase-edge-errors.test.js +72 -0
- package/dist/firebase-edge-errors.test.js.map +1 -0
- package/dist/firebase-edge-server.d.ts +5 -4
- package/dist/firebase-edge-server.d.ts.map +1 -1
- package/dist/firebase-edge-server.js +22 -17
- package/dist/firebase-edge-server.js.map +1 -1
- package/dist/firebase-edge-server.test.js +55 -7
- package/dist/firebase-edge-server.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { FirebaseAdminAuth } from './auth/firebase-admin-auth.js';
|
|
2
2
|
import { FirebaseAuth } from './auth/firebase-auth.js';
|
|
3
3
|
import { signJWTCustomToken } from './auth/firebase-jwt.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { exchangeCodeForGitHubIdToken } from './auth/github-oauth.js';
|
|
5
|
+
import { exchangeCodeForGoogleIdToken } from './auth/google-oauth.js';
|
|
6
|
+
import { createGitHubOAuthLoginUrl, createGoogleOAuthLoginUrl } from './auth/oauth.js';
|
|
7
|
+
import { FirebaseEdgeError } from './auth/errors.js';
|
|
8
|
+
import { FirebaseEdgeServerErrorInfo } from './firebase-edge-errors.js';
|
|
6
9
|
const DEFAULT_SESSION_NAME = '__session';
|
|
7
10
|
const COOKIE_OPTIONS = {
|
|
8
11
|
httpOnly: true,
|
|
@@ -32,16 +35,17 @@ export const OFFICIAL_FIREBASE_OAUTH_PROVIDERS = [
|
|
|
32
35
|
* @param config.firebaseConfig Firebase client configuration
|
|
33
36
|
* @param config.providers OAuth provider configurations (Google, GitHub, etc.)
|
|
34
37
|
* @param config.cookies Cookie management functions
|
|
38
|
+
* @param config.tenantId Optional Firebase Auth tenant ID for multi-tenancy
|
|
35
39
|
* @param config.fetch Optional custom fetch implementation
|
|
36
40
|
* @returns Object with authentication methods
|
|
37
41
|
*/
|
|
38
|
-
export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, fetch }) {
|
|
42
|
+
export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, tenantId, fetch }) {
|
|
39
43
|
const sessionName = cookies.sessionName || DEFAULT_SESSION_NAME;
|
|
40
44
|
const getSession = cookies.getSession;
|
|
41
45
|
const saveSession = cookies.saveSession;
|
|
42
46
|
const fetchImpl = fetch ?? globalThis.fetch;
|
|
43
|
-
const auth = new FirebaseAuth(firebaseConfig, fetchImpl);
|
|
44
|
-
const adminAuth = new FirebaseAdminAuth(serviceAccount, fetchImpl);
|
|
47
|
+
const auth = new FirebaseAuth(firebaseConfig, tenantId, fetchImpl);
|
|
48
|
+
const adminAuth = new FirebaseAdminAuth(serviceAccount, tenantId, fetchImpl);
|
|
45
49
|
/**
|
|
46
50
|
* Clears the session cookie
|
|
47
51
|
* @internal
|
|
@@ -105,7 +109,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
105
109
|
async function getGoogleLoginURL(redirect_uri, path) {
|
|
106
110
|
deleteSession();
|
|
107
111
|
if (!providers.google) {
|
|
108
|
-
throw new
|
|
112
|
+
throw new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GOOGLE_PROVIDER_NOT_CONFIGURED);
|
|
109
113
|
}
|
|
110
114
|
const { client_id } = providers.google;
|
|
111
115
|
return createGoogleOAuthLoginUrl(redirect_uri, path, client_id);
|
|
@@ -121,7 +125,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
121
125
|
async function getGitHubLoginURL(redirect_uri, path) {
|
|
122
126
|
deleteSession();
|
|
123
127
|
if (!providers.github) {
|
|
124
|
-
throw new
|
|
128
|
+
throw new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GITHUB_PROVIDER_NOT_CONFIGURED);
|
|
125
129
|
}
|
|
126
130
|
const { client_id } = providers.github;
|
|
127
131
|
return createGitHubOAuthLoginUrl(redirect_uri, path, client_id);
|
|
@@ -138,7 +142,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
138
142
|
const provider = state ? JSON.parse(state).provider : null;
|
|
139
143
|
if (!provider) {
|
|
140
144
|
return {
|
|
141
|
-
error: new
|
|
145
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_PROVIDER_IN_STATE)
|
|
142
146
|
};
|
|
143
147
|
}
|
|
144
148
|
let oauthToken = null;
|
|
@@ -152,7 +156,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
152
156
|
}
|
|
153
157
|
if (!googleData) {
|
|
154
158
|
return {
|
|
155
|
-
error: new
|
|
159
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_EXCHANGE_DATA)
|
|
156
160
|
};
|
|
157
161
|
}
|
|
158
162
|
oauthToken = googleData.id_token;
|
|
@@ -167,14 +171,14 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
167
171
|
}
|
|
168
172
|
if (!githubData) {
|
|
169
173
|
return {
|
|
170
|
-
error: new
|
|
174
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_EXCHANGE_DATA)
|
|
171
175
|
};
|
|
172
176
|
}
|
|
173
177
|
oauthToken = githubData.access_token;
|
|
174
178
|
}
|
|
175
179
|
if (!oauthToken) {
|
|
176
180
|
return {
|
|
177
|
-
error: new
|
|
181
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_OAUTH_TOKEN)
|
|
178
182
|
};
|
|
179
183
|
}
|
|
180
184
|
const providerId = provider === 'google' ? 'google.com' : 'github.com';
|
|
@@ -186,12 +190,12 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
186
190
|
}
|
|
187
191
|
if (!signInData) {
|
|
188
192
|
return {
|
|
189
|
-
error: new
|
|
193
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_SIGN_IN_DATA)
|
|
190
194
|
};
|
|
191
195
|
}
|
|
192
196
|
if (signInData.needConfirmation) {
|
|
193
197
|
return {
|
|
194
|
-
error: new
|
|
198
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_ACCOUNT_EXISTS_DIFFERENT_METHOD)
|
|
195
199
|
};
|
|
196
200
|
}
|
|
197
201
|
const idToken = signInData?.idToken ??
|
|
@@ -200,7 +204,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
200
204
|
null;
|
|
201
205
|
if (!idToken) {
|
|
202
206
|
return {
|
|
203
|
-
error: new
|
|
207
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_ID_TOKEN)
|
|
204
208
|
};
|
|
205
209
|
}
|
|
206
210
|
const { data: sessionCookie, error: sessionError } = await adminAuth.createSessionCookie(idToken, {
|
|
@@ -213,7 +217,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
213
217
|
}
|
|
214
218
|
if (!sessionCookie) {
|
|
215
219
|
return {
|
|
216
|
-
error: new
|
|
220
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_SESSION_COOKIE)
|
|
217
221
|
};
|
|
218
222
|
}
|
|
219
223
|
saveSession(sessionName, sessionCookie, COOKIE_OPTIONS);
|
|
@@ -240,7 +244,8 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
240
244
|
error: null
|
|
241
245
|
};
|
|
242
246
|
}
|
|
243
|
-
const
|
|
247
|
+
const claims = tenantId ? { tenant_id: tenantId } : {};
|
|
248
|
+
const { data: signJWTData, error: signJWTError } = await signJWTCustomToken(verifiedToken.sub, serviceAccount, claims);
|
|
244
249
|
if (signJWTError) {
|
|
245
250
|
return {
|
|
246
251
|
data: null,
|
|
@@ -250,7 +255,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
250
255
|
if (!signJWTData) {
|
|
251
256
|
return {
|
|
252
257
|
data: null,
|
|
253
|
-
error: new
|
|
258
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_CUSTOM_TOKEN_SIGNED)
|
|
254
259
|
};
|
|
255
260
|
}
|
|
256
261
|
const { data: signInData, error: signInError } = await auth.signInWithCustomToken(signJWTData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase-edge-server.js","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.js","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
2
|
import { createFirebaseEdgeServer, OFFICIAL_FIREBASE_OAUTH_PROVIDERS } from './firebase-edge-server.js';
|
|
3
|
+
import { FirebaseEdgeError } from './auth/errors.js';
|
|
4
|
+
import { FirebaseEdgeServerErrorInfo } from './firebase-edge-errors.js';
|
|
3
5
|
// Mock dependencies
|
|
4
6
|
vi.mock('./auth/firebase-admin-auth.js');
|
|
5
7
|
vi.mock('./auth/firebase-auth.js');
|
|
6
8
|
vi.mock('./auth/firebase-jwt.js');
|
|
9
|
+
vi.mock('./auth/oauth.js');
|
|
7
10
|
vi.mock('./auth/google-oauth.js');
|
|
8
11
|
vi.mock('./auth/github-oauth.js');
|
|
12
|
+
// Import the mocked classes to verify constructor calls
|
|
13
|
+
const { FirebaseAdminAuth } = await import('./auth/firebase-admin-auth.js');
|
|
14
|
+
const { FirebaseAuth } = await import('./auth/firebase-auth.js');
|
|
9
15
|
const mockServiceAccount = {
|
|
10
16
|
type: 'service_account',
|
|
11
17
|
project_id: 'test-project',
|
|
@@ -97,6 +103,48 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
97
103
|
});
|
|
98
104
|
expect(customServer).toBeDefined();
|
|
99
105
|
});
|
|
106
|
+
it('accepts tenant ID parameter', () => {
|
|
107
|
+
const serverWithTenant = createFirebaseEdgeServer({
|
|
108
|
+
serviceAccount: mockServiceAccount,
|
|
109
|
+
firebaseConfig: mockFirebaseConfig,
|
|
110
|
+
providers: mockProviders,
|
|
111
|
+
cookies: {
|
|
112
|
+
getSession: mockGetSession,
|
|
113
|
+
saveSession: mockSaveSession
|
|
114
|
+
},
|
|
115
|
+
tenantId: 'test-tenant'
|
|
116
|
+
});
|
|
117
|
+
expect(serverWithTenant).toBeDefined();
|
|
118
|
+
});
|
|
119
|
+
it('passes tenant ID to auth constructors', () => {
|
|
120
|
+
vi.clearAllMocks();
|
|
121
|
+
createFirebaseEdgeServer({
|
|
122
|
+
serviceAccount: mockServiceAccount,
|
|
123
|
+
firebaseConfig: mockFirebaseConfig,
|
|
124
|
+
providers: mockProviders,
|
|
125
|
+
cookies: {
|
|
126
|
+
getSession: mockGetSession,
|
|
127
|
+
saveSession: mockSaveSession
|
|
128
|
+
},
|
|
129
|
+
tenantId: 'test-tenant-id'
|
|
130
|
+
});
|
|
131
|
+
expect(vi.mocked(FirebaseAuth)).toHaveBeenCalledWith(mockFirebaseConfig, 'test-tenant-id', globalThis.fetch);
|
|
132
|
+
expect(vi.mocked(FirebaseAdminAuth)).toHaveBeenCalledWith(mockServiceAccount, 'test-tenant-id', globalThis.fetch);
|
|
133
|
+
});
|
|
134
|
+
it('passes undefined tenant ID when not provided', () => {
|
|
135
|
+
vi.clearAllMocks();
|
|
136
|
+
createFirebaseEdgeServer({
|
|
137
|
+
serviceAccount: mockServiceAccount,
|
|
138
|
+
firebaseConfig: mockFirebaseConfig,
|
|
139
|
+
providers: mockProviders,
|
|
140
|
+
cookies: {
|
|
141
|
+
getSession: mockGetSession,
|
|
142
|
+
saveSession: mockSaveSession
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
expect(vi.mocked(FirebaseAuth)).toHaveBeenCalledWith(mockFirebaseConfig, undefined, globalThis.fetch);
|
|
146
|
+
expect(vi.mocked(FirebaseAdminAuth)).toHaveBeenCalledWith(mockServiceAccount, undefined, globalThis.fetch);
|
|
147
|
+
});
|
|
100
148
|
});
|
|
101
149
|
describe('signOut', () => {
|
|
102
150
|
it('clears session cookie with proper options', () => {
|
|
@@ -132,10 +180,10 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
132
180
|
saveSession: mockSaveSession
|
|
133
181
|
}
|
|
134
182
|
});
|
|
135
|
-
await expect(serverWithoutGoogle.getGoogleLoginURL('http://localhost', '/dashboard')).rejects.toThrow(
|
|
183
|
+
await expect(serverWithoutGoogle.getGoogleLoginURL('http://localhost', '/dashboard')).rejects.toThrow(new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GOOGLE_PROVIDER_NOT_CONFIGURED));
|
|
136
184
|
});
|
|
137
185
|
it('calls deleteSession before generating URL', async () => {
|
|
138
|
-
const { createGoogleOAuthLoginUrl } = await import('./auth/
|
|
186
|
+
const { createGoogleOAuthLoginUrl } = await import('./auth/oauth.js');
|
|
139
187
|
vi.mocked(createGoogleOAuthLoginUrl).mockReturnValue('http://oauth-url');
|
|
140
188
|
await server.getGoogleLoginURL('http://localhost', '/dashboard');
|
|
141
189
|
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', expect.objectContaining({ maxAge: 0 }));
|
|
@@ -152,10 +200,10 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
152
200
|
saveSession: mockSaveSession
|
|
153
201
|
}
|
|
154
202
|
});
|
|
155
|
-
await expect(serverWithoutGitHub.getGitHubLoginURL('http://localhost', '/dashboard')).rejects.toThrow(
|
|
203
|
+
await expect(serverWithoutGitHub.getGitHubLoginURL('http://localhost', '/dashboard')).rejects.toThrow(new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GITHUB_PROVIDER_NOT_CONFIGURED));
|
|
156
204
|
});
|
|
157
205
|
it('calls deleteSession before generating URL', async () => {
|
|
158
|
-
const { createGitHubOAuthLoginUrl } = await import('./auth/
|
|
206
|
+
const { createGitHubOAuthLoginUrl } = await import('./auth/oauth.js');
|
|
159
207
|
vi.mocked(createGitHubOAuthLoginUrl).mockReturnValue('http://github-oauth-url');
|
|
160
208
|
await server.getGitHubLoginURL('http://localhost', '/dashboard');
|
|
161
209
|
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', expect.objectContaining({ maxAge: 0 }));
|
|
@@ -165,10 +213,10 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
165
213
|
it('returns error when no provider specified in state', async () => {
|
|
166
214
|
const result = await server.signInWithCode('auth-code', 'http://localhost', null);
|
|
167
215
|
expect(result).toEqual({
|
|
168
|
-
error: expect.any(
|
|
216
|
+
error: expect.any(FirebaseEdgeError)
|
|
169
217
|
});
|
|
170
|
-
expect(result.error).toBeInstanceOf(
|
|
171
|
-
expect(result.error.
|
|
218
|
+
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
219
|
+
expect(result.error.code).toBe(FirebaseEdgeServerErrorInfo.EDGE_NO_PROVIDER_IN_STATE.code);
|
|
172
220
|
});
|
|
173
221
|
it('handles invalid JSON state gracefully', async () => {
|
|
174
222
|
// We expect this to throw during JSON.parse, which is the current behavior
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase-edge-server.test.js","sourceRoot":"","sources":["../src/firebase-edge-server.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAa,MAAM,QAAQ,CAAC;AACzE,OAAO,EACH,wBAAwB,EACxB,iCAAiC,EACpC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.test.js","sourceRoot":"","sources":["../src/firebase-edge-server.test.ts"],"names":[],"mappings":"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"}
|