firebase-admin-edge 1.0.21 → 1.0.23
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 +58 -20
- package/dist/auth/auth-endpoint-errors.test.d.ts +2 -0
- package/dist/auth/auth-endpoint-errors.test.d.ts.map +1 -0
- package/dist/auth/auth-endpoint-errors.test.js +403 -0
- package/dist/auth/auth-endpoint-errors.test.js.map +1 -0
- package/dist/auth/cache-types.d.ts +7 -0
- package/dist/auth/cache-types.d.ts.map +1 -0
- package/dist/auth/cache-types.js +2 -0
- package/dist/auth/cache-types.js.map +1 -0
- package/dist/auth/cookie-types.d.ts +4 -0
- package/dist/auth/cookie-types.d.ts.map +1 -1
- package/dist/auth/errors.test.d.ts +2 -0
- package/dist/auth/errors.test.d.ts.map +1 -0
- package/dist/auth/errors.test.js +123 -0
- package/dist/auth/errors.test.js.map +1 -0
- package/dist/auth/firebase-admin-auth.d.ts +75 -10
- package/dist/auth/firebase-admin-auth.d.ts.map +1 -1
- package/dist/auth/firebase-admin-auth.js +111 -28
- package/dist/auth/firebase-admin-auth.js.map +1 -1
- package/dist/auth/firebase-admin-auth.test.js +144 -35
- package/dist/auth/firebase-admin-auth.test.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.d.ts +50 -11
- package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -1
- package/dist/auth/firebase-auth-endpoints.js +101 -4
- package/dist/auth/firebase-auth-endpoints.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.test.js +331 -8
- package/dist/auth/firebase-auth-endpoints.test.js.map +1 -1
- package/dist/auth/firebase-auth.d.ts +43 -2
- package/dist/auth/firebase-auth.d.ts.map +1 -1
- package/dist/auth/firebase-auth.js +85 -7
- package/dist/auth/firebase-auth.js.map +1 -1
- package/dist/auth/firebase-auth.test.js +57 -4
- package/dist/auth/firebase-auth.test.js.map +1 -1
- package/dist/auth/firebase-jwt.d.ts.map +1 -1
- package/dist/auth/firebase-jwt.js +1 -0
- package/dist/auth/firebase-jwt.js.map +1 -1
- package/dist/auth/firebase-types.d.ts +17 -0
- package/dist/auth/firebase-types.d.ts.map +1 -1
- package/dist/auth/google-oauth.d.ts +5 -10
- package/dist/auth/google-oauth.d.ts.map +1 -1
- package/dist/auth/google-oauth.js +12 -1
- package/dist/auth/google-oauth.js.map +1 -1
- package/dist/auth/oauth.d.ts +2 -2
- package/dist/auth/oauth.d.ts.map +1 -1
- package/dist/auth/oauth.js +43 -23
- package/dist/auth/oauth.js.map +1 -1
- package/dist/auth/oauth.test.js +44 -172
- package/dist/auth/oauth.test.js.map +1 -1
- package/dist/firebase-edge-server.d.ts +28 -14
- package/dist/firebase-edge-server.d.ts.map +1 -1
- package/dist/firebase-edge-server.js +61 -35
- package/dist/firebase-edge-server.js.map +1 -1
- package/dist/firebase-edge-server.test.js +7 -7
- package/dist/firebase-edge-server.test.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/token-cache.d.ts +9 -0
- package/dist/utils/token-cache.d.ts.map +1 -0
- package/dist/utils/token-cache.js +27 -0
- package/dist/utils/token-cache.js.map +1 -0
- package/package.json +1 -1
package/dist/auth/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB,CACrC,YAAoB,EACpB,IAAY,EACZ,SAAiB;
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB,CACrC,YAAoB,EACpB,IAAY,EACZ,SAAiB,EACjB,gBAAyC,EACzC,SAAoB;IAEpB,6DAA6D;IAC7D,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEtE,MAAM,MAAM,GAA2B;QACnC,SAAS;QACT,YAAY;QACZ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACvB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;YAClB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,QAAQ;SACrB,CAAC;KACL,CAAC;IAEF,oEAAoE;IACpE,IAAI,gBAAgB,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,GAAG,CACV,2CAA2C;QACvC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAC7C,CAAC,QAAQ,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACrC,YAAoB,EACpB,IAAY,EACZ,SAAiB,EACjB,YAAqB,EACrB,gBAAyC,EACzC,SAAoB;IAEpB,6DAA6D;IAC7D,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEtE,MAAM,MAAM,GAA2B;QACnC,SAAS;QACT,YAAY;QACZ,aAAa,EAAE,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACvB,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;YAClB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,QAAQ;SACrB,CAAC;KACL,CAAC;IAEF,gEAAgE;IAChE,IAAI,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,EAAE,GAAG,YAAY,CAAC;IAC7B,CAAC;IAED,iFAAiF;IACjF,IAAI,gBAAgB,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,GAAG,CACV,+CAA+C;QAC3C,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAC7C,CAAC,QAAQ,EAAE,CAAC;AACjB,CAAC"}
|
package/dist/auth/oauth.test.js
CHANGED
|
@@ -1,21 +1,5 @@
|
|
|
1
|
-
import { describe, expect, it
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import { createGitHubOAuthLoginUrl, createGoogleOAuthLoginUrl } from './oauth.js';
|
|
3
|
-
import { exchangeCodeForGitHubIdToken } from './github-oauth.js';
|
|
4
|
-
import { exchangeCodeForGoogleIdToken, getToken } from './google-oauth.js';
|
|
5
|
-
import { FirebaseEdgeError } from './errors.js';
|
|
6
|
-
import { GitHubErrorInfo } from './auth-error-codes.js';
|
|
7
|
-
const restFetchMock = vi.hoisted(() => vi.fn());
|
|
8
|
-
const signJWTMock = vi.hoisted(() => vi.fn());
|
|
9
|
-
vi.mock('../rest-fetch.js', () => ({
|
|
10
|
-
restFetch: restFetchMock
|
|
11
|
-
}));
|
|
12
|
-
vi.mock('./firebase-jwt.js', () => ({
|
|
13
|
-
signJWT: signJWTMock
|
|
14
|
-
}));
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
restFetchMock.mockReset();
|
|
17
|
-
signJWTMock.mockReset();
|
|
18
|
-
});
|
|
19
3
|
describe('OAuth', () => {
|
|
20
4
|
describe('URL Creation', () => {
|
|
21
5
|
describe('createGitHubOAuthLoginUrl', () => {
|
|
@@ -40,6 +24,23 @@ describe('OAuth', () => {
|
|
|
40
24
|
expect(state.next).toBe('/dashboard?tab=settings&theme=dark');
|
|
41
25
|
expect(state.provider).toBe('github');
|
|
42
26
|
});
|
|
27
|
+
it('adds custom parameters to URL', () => {
|
|
28
|
+
const url = createGitHubOAuthLoginUrl('https://example.com/callback', '/next/path', 'client-123', { login: 'testuser', allow_signup: 'false' });
|
|
29
|
+
const parsed = new URL(url);
|
|
30
|
+
expect(parsed.searchParams.get('login')).toBe('testuser');
|
|
31
|
+
expect(parsed.searchParams.get('allow_signup')).toBe('false');
|
|
32
|
+
});
|
|
33
|
+
it('adds additional scopes to default scopes', () => {
|
|
34
|
+
const url = createGitHubOAuthLoginUrl('https://example.com/callback', '/next/path', 'client-123', undefined, ['repo', 'gist']);
|
|
35
|
+
const parsed = new URL(url);
|
|
36
|
+
expect(parsed.searchParams.get('scope')).toBe('read:user user:email repo gist');
|
|
37
|
+
});
|
|
38
|
+
it('combines custom parameters and additional scopes', () => {
|
|
39
|
+
const url = createGitHubOAuthLoginUrl('https://example.com/callback', '/next/path', 'client-123', { login: 'testuser' }, ['repo']);
|
|
40
|
+
const parsed = new URL(url);
|
|
41
|
+
expect(parsed.searchParams.get('login')).toBe('testuser');
|
|
42
|
+
expect(parsed.searchParams.get('scope')).toBe('read:user user:email repo');
|
|
43
|
+
});
|
|
43
44
|
});
|
|
44
45
|
describe('createGoogleOAuthLoginUrl', () => {
|
|
45
46
|
it('builds expected Google consent screen URL', () => {
|
|
@@ -57,6 +58,32 @@ describe('OAuth', () => {
|
|
|
57
58
|
provider: 'google'
|
|
58
59
|
});
|
|
59
60
|
});
|
|
61
|
+
it('adds language code parameter', () => {
|
|
62
|
+
const url = createGoogleOAuthLoginUrl('https://example.com/callback', '/next/path', 'client-123', 'es');
|
|
63
|
+
const parsed = new URL(url);
|
|
64
|
+
expect(parsed.searchParams.get('hl')).toBe('es');
|
|
65
|
+
});
|
|
66
|
+
it('adds custom parameters to URL', () => {
|
|
67
|
+
const url = createGoogleOAuthLoginUrl('https://example.com/callback', '/next/path', 'client-123', undefined, { login_hint: 'user@example.com', hd: 'example.com' });
|
|
68
|
+
const parsed = new URL(url);
|
|
69
|
+
expect(parsed.searchParams.get('login_hint')).toBe('user@example.com');
|
|
70
|
+
expect(parsed.searchParams.get('hd')).toBe('example.com');
|
|
71
|
+
});
|
|
72
|
+
it('adds additional scopes to default scopes', () => {
|
|
73
|
+
const url = createGoogleOAuthLoginUrl('https://example.com/callback', '/next/path', 'client-123', undefined, undefined, [
|
|
74
|
+
'https://www.googleapis.com/auth/calendar.readonly',
|
|
75
|
+
'https://www.googleapis.com/auth/drive.file'
|
|
76
|
+
]);
|
|
77
|
+
const parsed = new URL(url);
|
|
78
|
+
expect(parsed.searchParams.get('scope')).toBe('openid email profile https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/drive.file');
|
|
79
|
+
});
|
|
80
|
+
it('combines language code, custom parameters, and additional scopes', () => {
|
|
81
|
+
const url = createGoogleOAuthLoginUrl('https://example.com/callback', '/next/path', 'client-123', 'fr', { login_hint: 'user@example.com' }, ['https://www.googleapis.com/auth/calendar.readonly']);
|
|
82
|
+
const parsed = new URL(url);
|
|
83
|
+
expect(parsed.searchParams.get('hl')).toBe('fr');
|
|
84
|
+
expect(parsed.searchParams.get('login_hint')).toBe('user@example.com');
|
|
85
|
+
expect(parsed.searchParams.get('scope')).toBe('openid email profile https://www.googleapis.com/auth/calendar.readonly');
|
|
86
|
+
});
|
|
60
87
|
});
|
|
61
88
|
describe('URL encoding and safety', () => {
|
|
62
89
|
it('properly encodes special characters in GitHub URLs', () => {
|
|
@@ -74,160 +101,5 @@ describe('OAuth', () => {
|
|
|
74
101
|
});
|
|
75
102
|
});
|
|
76
103
|
});
|
|
77
|
-
describe('GitHub OAuth', () => {
|
|
78
|
-
const payload = {
|
|
79
|
-
code: 'auth-code',
|
|
80
|
-
redirect_uri: 'https://example.com/callback',
|
|
81
|
-
client_id: 'client-123',
|
|
82
|
-
client_secret: 'secret-xyz'
|
|
83
|
-
};
|
|
84
|
-
describe('exchangeCodeForGitHubIdToken', () => {
|
|
85
|
-
it('returns token data when REST call succeeds', async () => {
|
|
86
|
-
const expectedData = {
|
|
87
|
-
access_token: 'gho_token',
|
|
88
|
-
token_type: 'bearer',
|
|
89
|
-
scope: 'read:user,user:email'
|
|
90
|
-
};
|
|
91
|
-
restFetchMock.mockResolvedValue({
|
|
92
|
-
data: expectedData,
|
|
93
|
-
error: null
|
|
94
|
-
});
|
|
95
|
-
const result = await exchangeCodeForGitHubIdToken(payload.code, payload.redirect_uri, payload.client_id, payload.client_secret);
|
|
96
|
-
expect(restFetchMock).toHaveBeenCalledWith('https://github.com/login/oauth/access_token', expect.objectContaining({
|
|
97
|
-
body: expect.objectContaining(payload),
|
|
98
|
-
form: true,
|
|
99
|
-
acceptJson: true
|
|
100
|
-
}));
|
|
101
|
-
expect(result).toEqual({ data: expectedData, error: null });
|
|
102
|
-
});
|
|
103
|
-
it('handles incorrect client credentials error', async () => {
|
|
104
|
-
const githubError = {
|
|
105
|
-
error: 'incorrect_client_credentials',
|
|
106
|
-
error_description: 'The client_id and/or client_secret passed are incorrect.'
|
|
107
|
-
};
|
|
108
|
-
restFetchMock.mockResolvedValue({
|
|
109
|
-
data: null,
|
|
110
|
-
error: githubError
|
|
111
|
-
});
|
|
112
|
-
const result = await exchangeCodeForGitHubIdToken(payload.code, payload.redirect_uri, payload.client_id, payload.client_secret);
|
|
113
|
-
expect(result.data).toBeNull();
|
|
114
|
-
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
115
|
-
expect(result.error?.code).toBe('auth/github-incorrect-client-credentials');
|
|
116
|
-
expect(result.error?.message).toBe(GitHubErrorInfo.GITHUB_INCORRECT_CLIENT_CREDENTIALS.message);
|
|
117
|
-
});
|
|
118
|
-
it('handles bad verification code error', async () => {
|
|
119
|
-
const githubError = {
|
|
120
|
-
error: 'bad_verification_code',
|
|
121
|
-
error_description: 'The code passed is incorrect or expired.'
|
|
122
|
-
};
|
|
123
|
-
restFetchMock.mockResolvedValue({
|
|
124
|
-
data: null,
|
|
125
|
-
error: githubError
|
|
126
|
-
});
|
|
127
|
-
const result = await exchangeCodeForGitHubIdToken(payload.code, payload.redirect_uri, payload.client_id, payload.client_secret);
|
|
128
|
-
expect(result.data).toBeNull();
|
|
129
|
-
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
130
|
-
expect(result.error?.code).toBe('auth/github-bad-verification-code');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
describe('Google OAuth', () => {
|
|
135
|
-
const payload = {
|
|
136
|
-
code: 'auth-code',
|
|
137
|
-
redirect_uri: 'https://example.com/callback',
|
|
138
|
-
client_id: 'client-123',
|
|
139
|
-
client_secret: 'secret-xyz'
|
|
140
|
-
};
|
|
141
|
-
describe('exchangeCodeForGoogleIdToken', () => {
|
|
142
|
-
it('returns token data when REST call succeeds', async () => {
|
|
143
|
-
const expectedData = { id_token: 'id', access_token: 'access' };
|
|
144
|
-
restFetchMock.mockResolvedValue({
|
|
145
|
-
data: expectedData,
|
|
146
|
-
error: null
|
|
147
|
-
});
|
|
148
|
-
const result = await exchangeCodeForGoogleIdToken(payload.code, payload.redirect_uri, payload.client_id, payload.client_secret);
|
|
149
|
-
expect(restFetchMock).toHaveBeenCalledWith('https://oauth2.googleapis.com/token', expect.objectContaining({
|
|
150
|
-
body: expect.objectContaining(payload),
|
|
151
|
-
form: true
|
|
152
|
-
}));
|
|
153
|
-
expect(result).toEqual({ data: expectedData, error: null });
|
|
154
|
-
});
|
|
155
|
-
it('returns upstream error when REST call fails', async () => {
|
|
156
|
-
const apiError = { code: 400, message: 'invalid_grant' };
|
|
157
|
-
restFetchMock.mockResolvedValue({
|
|
158
|
-
data: null,
|
|
159
|
-
error: { error: apiError }
|
|
160
|
-
});
|
|
161
|
-
const result = await exchangeCodeForGoogleIdToken(payload.code, payload.redirect_uri, payload.client_id, payload.client_secret);
|
|
162
|
-
expect(result.data).toBeNull();
|
|
163
|
-
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
164
|
-
expect(result.error?.code).toBe('auth/google-invalid-grant');
|
|
165
|
-
});
|
|
166
|
-
it('handles invalid client error', async () => {
|
|
167
|
-
const apiError = { code: 401, message: 'invalid_client' };
|
|
168
|
-
restFetchMock.mockResolvedValue({
|
|
169
|
-
data: null,
|
|
170
|
-
error: { error: apiError }
|
|
171
|
-
});
|
|
172
|
-
const result = await exchangeCodeForGoogleIdToken(payload.code, payload.redirect_uri, payload.client_id, payload.client_secret);
|
|
173
|
-
expect(result.data).toBeNull();
|
|
174
|
-
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
175
|
-
expect(result.error?.code).toBe('auth/google-invalid-client');
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
describe('getToken', () => {
|
|
179
|
-
const serviceAccount = {
|
|
180
|
-
client_email: 'test@project.iam.gserviceaccount.com',
|
|
181
|
-
private_key: '-----BEGIN PRIVATE KEY-----\nABC\n-----END PRIVATE KEY-----\n',
|
|
182
|
-
token_uri: 'https://oauth2.googleapis.com/token'
|
|
183
|
-
};
|
|
184
|
-
it('requests new token with signed JWT', async () => {
|
|
185
|
-
const fakeFetch = vi.fn();
|
|
186
|
-
const tokenData = { access_token: 'ya29', expires_in: 3600 };
|
|
187
|
-
signJWTMock.mockResolvedValue({
|
|
188
|
-
data: 'signed-jwt',
|
|
189
|
-
error: null
|
|
190
|
-
});
|
|
191
|
-
restFetchMock.mockResolvedValue({
|
|
192
|
-
data: tokenData,
|
|
193
|
-
error: null
|
|
194
|
-
});
|
|
195
|
-
const result = await getToken(serviceAccount, fakeFetch);
|
|
196
|
-
expect(signJWTMock).toHaveBeenCalledWith(serviceAccount);
|
|
197
|
-
expect(result).toEqual({ data: tokenData, error: null });
|
|
198
|
-
});
|
|
199
|
-
it('short-circuits when signJWT returns error', async () => {
|
|
200
|
-
const jwtError = { code: 401, message: 'bad cert', errors: [] };
|
|
201
|
-
signJWTMock.mockResolvedValue({ data: null, error: jwtError });
|
|
202
|
-
const result = await getToken(serviceAccount);
|
|
203
|
-
expect(restFetchMock).not.toHaveBeenCalled();
|
|
204
|
-
expect(result.data).toBeNull();
|
|
205
|
-
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
206
|
-
expect(result.error?.code).toBe('auth/jwt-sign-failed');
|
|
207
|
-
});
|
|
208
|
-
it('reports missing JWT data', async () => {
|
|
209
|
-
signJWTMock.mockResolvedValue({ data: null, error: null });
|
|
210
|
-
const result = await getToken(serviceAccount);
|
|
211
|
-
expect(result.data).toBeNull();
|
|
212
|
-
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
213
|
-
expect(result.error?.code).toBe('auth/jwt-data-missing');
|
|
214
|
-
});
|
|
215
|
-
it('returns REST error payload from Google', async () => {
|
|
216
|
-
const apiError = { code: 503, message: 'unavailable' };
|
|
217
|
-
signJWTMock.mockResolvedValue({
|
|
218
|
-
data: 'signed-jwt',
|
|
219
|
-
error: null
|
|
220
|
-
});
|
|
221
|
-
restFetchMock.mockResolvedValue({
|
|
222
|
-
data: null,
|
|
223
|
-
error: { error: apiError }
|
|
224
|
-
});
|
|
225
|
-
const result = await getToken(serviceAccount);
|
|
226
|
-
expect(result.data).toBeNull();
|
|
227
|
-
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
228
|
-
expect(result.error?.code).toBe('auth/google-temporarily-unavailable');
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
104
|
});
|
|
233
105
|
//# sourceMappingURL=oauth.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../src/auth/oauth.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../src/auth/oauth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CookieConfig, CookieOptions } from './auth/cookie-types.js';
|
|
2
2
|
import { FirebaseAdminAuth } from './auth/firebase-admin-auth.js';
|
|
3
3
|
import { FirebaseAuth } from './auth/firebase-auth.js';
|
|
4
4
|
import type { FirebaseConfig, ServiceAccount } from './auth/firebase-types.js';
|
|
5
5
|
import { FirebaseEdgeError } from './auth/errors.js';
|
|
6
|
+
import type { CacheConfig } from './auth/cache-types.js';
|
|
6
7
|
/**
|
|
7
8
|
* Official Firebase OAuth providers
|
|
8
9
|
*/
|
|
@@ -12,11 +13,6 @@ type ProviderConfig = Partial<Record<ProviderList, {
|
|
|
12
13
|
client_id: string;
|
|
13
14
|
client_secret: string;
|
|
14
15
|
}>>;
|
|
15
|
-
type CookieConfig = {
|
|
16
|
-
getSession: GetSession;
|
|
17
|
-
saveSession: SetSession;
|
|
18
|
-
sessionName?: string;
|
|
19
|
-
};
|
|
20
16
|
/**
|
|
21
17
|
* Creates a Firebase Edge Server for authentication and session management in edge environments.
|
|
22
18
|
*
|
|
@@ -24,18 +20,29 @@ type CookieConfig = {
|
|
|
24
20
|
* @param config.serviceAccount Firebase service account for admin operations
|
|
25
21
|
* @param config.firebaseConfig Firebase client configuration
|
|
26
22
|
* @param config.providers OAuth provider configurations (Google, GitHub, etc.)
|
|
27
|
-
* @param config.cookies Cookie management functions
|
|
23
|
+
* @param config.cookies Cookie management functions (getSession, saveSession)
|
|
24
|
+
* @param config.redirectUri OAuth callback redirect URI
|
|
25
|
+
* @param config.cache Optional cache implementation for token caching
|
|
26
|
+
* @param config.cacheName Optional cache key name for token storage
|
|
27
|
+
* @param config.cookieName Optional custom session cookie name (defaults to '__session')
|
|
28
|
+
* @param config.cookieOptions Optional cookie configuration overrides
|
|
28
29
|
* @param config.tenantId Optional Firebase Auth tenant ID for multi-tenancy
|
|
30
|
+
* @param config.autoLinkProviders Optional flag to automatically link accounts with same email
|
|
29
31
|
* @param config.fetch Optional custom fetch implementation
|
|
30
|
-
* @returns Object with authentication methods
|
|
32
|
+
* @returns Object with authentication methods (auth, adminAuth, signOut, getUser, getGoogleLoginURL, getGitHubLoginURL, signInWithCallback, getToken)
|
|
31
33
|
*/
|
|
32
|
-
export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, tenantId, redirectUri, fetch }: {
|
|
34
|
+
export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, cookieName, cookieOptions, cache, cacheName, tenantId, redirectUri, autoLinkProviders, fetch }: {
|
|
33
35
|
serviceAccount: ServiceAccount;
|
|
34
36
|
firebaseConfig: FirebaseConfig;
|
|
35
37
|
providers: ProviderConfig;
|
|
36
38
|
cookies: CookieConfig;
|
|
39
|
+
cache?: CacheConfig;
|
|
40
|
+
cacheName?: string;
|
|
41
|
+
cookieName?: string;
|
|
42
|
+
cookieOptions?: Partial<CookieOptions>;
|
|
37
43
|
redirectUri: string;
|
|
38
44
|
tenantId?: string;
|
|
45
|
+
autoLinkProviders?: boolean;
|
|
39
46
|
fetch?: typeof globalThis.fetch;
|
|
40
47
|
}): {
|
|
41
48
|
auth: FirebaseAuth;
|
|
@@ -46,14 +53,21 @@ export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfi
|
|
|
46
53
|
error: null;
|
|
47
54
|
} | {
|
|
48
55
|
data: null;
|
|
49
|
-
error:
|
|
56
|
+
error: FirebaseEdgeError;
|
|
50
57
|
} | {
|
|
51
58
|
data: import("./auth/firebase-types.js").FirebaseIdTokenPayload;
|
|
52
59
|
error: null;
|
|
53
60
|
}>;
|
|
54
|
-
getGoogleLoginURL: (next: string
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
getGoogleLoginURL: (next: string, options?: {
|
|
62
|
+
languageCode?: string;
|
|
63
|
+
customParameters?: Record<string, string>;
|
|
64
|
+
addScopes?: string[];
|
|
65
|
+
}) => Promise<string>;
|
|
66
|
+
getGitHubLoginURL: (next: string, options?: {
|
|
67
|
+
customParameters?: Record<string, string>;
|
|
68
|
+
addScopes?: string[];
|
|
69
|
+
}) => Promise<string>;
|
|
70
|
+
signInWithCallback: (url: URL, expiresIn_ms?: number) => Promise<{
|
|
57
71
|
error: FirebaseEdgeError;
|
|
58
72
|
data?: undefined;
|
|
59
73
|
} | {
|
|
@@ -62,7 +76,7 @@ export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfi
|
|
|
62
76
|
}>;
|
|
63
77
|
getToken: () => Promise<{
|
|
64
78
|
data: null;
|
|
65
|
-
error:
|
|
79
|
+
error: FirebaseEdgeError;
|
|
66
80
|
} | {
|
|
67
81
|
data: null;
|
|
68
82
|
error: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase-edge-server.d.ts","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.d.ts","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAYzD;;GAEG;AACH,eAAO,MAAM,iCAAiC,kGASpC,CAAC;AAEX,KAAK,YAAY,GAAG,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,KAAK,cAAc,GAAG,OAAO,CACzB,MAAM,CACF,YAAY,EACZ;IACI,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACzB,CACJ,CACJ,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,cAAc,EACd,cAAc,EACd,SAAS,EACT,OAAO,EACP,UAAU,EACV,aAAa,EACb,KAAK,EACL,SAAS,EACT,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,KAAK,EACR,EAAE;IACC,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACnC;;;;6BAuDwC,OAAO;;;;;;;;;;8BAiDlC,MAAM,YACF;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB;8BAkCK,MAAM,YACF;QACN,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB;8BA6BI,GAAG,iBACM,MAAM;;;;;;;;;;;;;;;;;EAwP3B"}
|
|
@@ -6,13 +6,13 @@ import { exchangeCodeForGoogleIdToken } from './auth/google-oauth.js';
|
|
|
6
6
|
import { createGitHubOAuthLoginUrl, createGoogleOAuthLoginUrl } from './auth/oauth.js';
|
|
7
7
|
import { FirebaseEdgeError } from './auth/errors.js';
|
|
8
8
|
import { FirebaseEdgeServerErrorInfo } from './firebase-edge-errors.js';
|
|
9
|
-
const
|
|
9
|
+
const COOKIE_LIFETIME_SECONDS = 60 * 60 * 24 * 5; // 5 days
|
|
10
10
|
const COOKIE_OPTIONS = {
|
|
11
11
|
httpOnly: true,
|
|
12
12
|
secure: true,
|
|
13
13
|
sameSite: 'lax',
|
|
14
14
|
path: '/',
|
|
15
|
-
maxAge:
|
|
15
|
+
maxAge: COOKIE_LIFETIME_SECONDS
|
|
16
16
|
};
|
|
17
17
|
/**
|
|
18
18
|
* Official Firebase OAuth providers
|
|
@@ -34,31 +34,42 @@ export const OFFICIAL_FIREBASE_OAUTH_PROVIDERS = [
|
|
|
34
34
|
* @param config.serviceAccount Firebase service account for admin operations
|
|
35
35
|
* @param config.firebaseConfig Firebase client configuration
|
|
36
36
|
* @param config.providers OAuth provider configurations (Google, GitHub, etc.)
|
|
37
|
-
* @param config.cookies Cookie management functions
|
|
37
|
+
* @param config.cookies Cookie management functions (getSession, saveSession)
|
|
38
|
+
* @param config.redirectUri OAuth callback redirect URI
|
|
39
|
+
* @param config.cache Optional cache implementation for token caching
|
|
40
|
+
* @param config.cacheName Optional cache key name for token storage
|
|
41
|
+
* @param config.cookieName Optional custom session cookie name (defaults to '__session')
|
|
42
|
+
* @param config.cookieOptions Optional cookie configuration overrides
|
|
38
43
|
* @param config.tenantId Optional Firebase Auth tenant ID for multi-tenancy
|
|
44
|
+
* @param config.autoLinkProviders Optional flag to automatically link accounts with same email
|
|
39
45
|
* @param config.fetch Optional custom fetch implementation
|
|
40
|
-
* @returns Object with authentication methods
|
|
46
|
+
* @returns Object with authentication methods (auth, adminAuth, signOut, getUser, getGoogleLoginURL, getGitHubLoginURL, signInWithCallback, getToken)
|
|
41
47
|
*/
|
|
42
|
-
export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, tenantId, redirectUri, fetch }) {
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
const saveSession = cookies
|
|
48
|
+
export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, cookieName, cookieOptions, cache, cacheName, tenantId, redirectUri, autoLinkProviders, fetch }) {
|
|
49
|
+
// Cookies
|
|
50
|
+
const _cookieName = cookieName || '__session';
|
|
51
|
+
const { getSession, saveSession } = cookies;
|
|
52
|
+
const _cookieOptions = { ...COOKIE_OPTIONS, ...cookieOptions };
|
|
53
|
+
// Fetch
|
|
46
54
|
const fetchImpl = fetch ?? globalThis.fetch;
|
|
47
|
-
const
|
|
48
|
-
|
|
55
|
+
const cacheImpl = cache ?? undefined;
|
|
56
|
+
// Auth instances
|
|
57
|
+
const auth = new FirebaseAuth(firebaseConfig, redirectUri, tenantId, fetchImpl);
|
|
58
|
+
const adminAuth = new FirebaseAdminAuth(serviceAccount, tenantId, fetchImpl, cacheImpl, cacheName);
|
|
49
59
|
/**
|
|
50
|
-
* Clears the session cookie
|
|
51
|
-
* @internal
|
|
60
|
+
* Clears the session cookie by setting its maxAge to 0.
|
|
52
61
|
*/
|
|
53
62
|
function deleteSession() {
|
|
54
|
-
saveSession(
|
|
55
|
-
...
|
|
63
|
+
saveSession(_cookieName, '', {
|
|
64
|
+
..._cookieOptions,
|
|
56
65
|
maxAge: 0
|
|
57
66
|
});
|
|
58
67
|
}
|
|
59
68
|
/**
|
|
60
69
|
* Signs out the current user by clearing the session cookie.
|
|
61
70
|
* Note: This only removes the server-side session, not Firebase client tokens.
|
|
71
|
+
*
|
|
72
|
+
* @returns void
|
|
62
73
|
*/
|
|
63
74
|
function signOut() {
|
|
64
75
|
deleteSession();
|
|
@@ -67,11 +78,11 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
67
78
|
/**
|
|
68
79
|
* Gets the current authenticated user from the session cookie.
|
|
69
80
|
*
|
|
70
|
-
* @param checkRevoked Whether to check if the token has been revoked
|
|
71
|
-
* @returns Promise with
|
|
81
|
+
* @param checkRevoked Whether to check if the token has been revoked (defaults to false)
|
|
82
|
+
* @returns Promise resolving to object with decoded token data or null, and error if any
|
|
72
83
|
*/
|
|
73
84
|
async function getUser(checkRevoked = false) {
|
|
74
|
-
const sessionCookie = await getSession(
|
|
85
|
+
const sessionCookie = await getSession(_cookieName);
|
|
75
86
|
if (!sessionCookie) {
|
|
76
87
|
return {
|
|
77
88
|
data: null,
|
|
@@ -101,40 +112,49 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
101
112
|
/**
|
|
102
113
|
* Generates a Google OAuth login URL and clears any existing session.
|
|
103
114
|
*
|
|
104
|
-
* @param next State parameter for the OAuth flow
|
|
105
|
-
* @
|
|
106
|
-
* @
|
|
115
|
+
* @param next State parameter for the OAuth flow (typically the redirect path after login)
|
|
116
|
+
* @param options Optional configuration object
|
|
117
|
+
* @param options.languageCode ISO 639-1 language code (e.g., 'en', 'es', 'fr')
|
|
118
|
+
* @param options.customParameters Custom OAuth parameters (e.g., { login_hint: 'user@example.com', hd: 'example.com' })
|
|
119
|
+
* @param options.addScopes Additional OAuth scopes (e.g., ['https://www.googleapis.com/auth/calendar.readonly'])
|
|
120
|
+
* @returns Promise resolving to Google OAuth login URL string
|
|
121
|
+
* @throws {FirebaseEdgeError} If Google provider is not configured
|
|
107
122
|
*/
|
|
108
|
-
async function getGoogleLoginURL(next) {
|
|
123
|
+
async function getGoogleLoginURL(next, options) {
|
|
109
124
|
deleteSession();
|
|
110
125
|
if (!providers.google) {
|
|
111
126
|
throw new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GOOGLE_PROVIDER_NOT_CONFIGURED);
|
|
112
127
|
}
|
|
113
128
|
const { client_id } = providers.google;
|
|
114
|
-
return createGoogleOAuthLoginUrl(redirectUri, next, client_id);
|
|
129
|
+
return createGoogleOAuthLoginUrl(redirectUri, next, client_id, options?.languageCode, options?.customParameters, options?.addScopes);
|
|
115
130
|
}
|
|
116
131
|
/**
|
|
117
132
|
* Generates a GitHub OAuth login URL and clears any existing session.
|
|
133
|
+
* Note: GitHub doesn't support language parameters - language is determined by user's browser/account settings.
|
|
118
134
|
*
|
|
119
|
-
* @param next State parameter for the OAuth flow
|
|
120
|
-
* @
|
|
121
|
-
* @
|
|
135
|
+
* @param next State parameter for the OAuth flow (typically the redirect path after login)
|
|
136
|
+
* @param options Optional configuration object
|
|
137
|
+
* @param options.customParameters Custom OAuth parameters (e.g., { login: 'username', allow_signup: 'false' })
|
|
138
|
+
* @param options.addScopes Additional OAuth scopes (e.g., ['repo', 'gist'])
|
|
139
|
+
* @returns Promise resolving to GitHub OAuth login URL string
|
|
140
|
+
* @throws {FirebaseEdgeError} If GitHub provider is not configured
|
|
122
141
|
*/
|
|
123
|
-
async function getGitHubLoginURL(next) {
|
|
142
|
+
async function getGitHubLoginURL(next, options) {
|
|
124
143
|
deleteSession();
|
|
125
144
|
if (!providers.github) {
|
|
126
145
|
throw new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GITHUB_PROVIDER_NOT_CONFIGURED);
|
|
127
146
|
}
|
|
128
147
|
const { client_id } = providers.github;
|
|
129
|
-
return createGitHubOAuthLoginUrl(redirectUri, next, client_id);
|
|
148
|
+
return createGitHubOAuthLoginUrl(redirectUri, next, client_id, options?.customParameters, options?.addScopes);
|
|
130
149
|
}
|
|
131
150
|
/**
|
|
132
151
|
* Completes OAuth flow by exchanging authorization code for a session.
|
|
133
152
|
*
|
|
134
153
|
* @param url URL containing authorization code and state from OAuth callback
|
|
135
|
-
* @
|
|
154
|
+
* @param expiresIn_ms Session cookie expiration time in milliseconds (defaults to 5 days)
|
|
155
|
+
* @returns Promise resolving to object with next redirect path and error if any
|
|
136
156
|
*/
|
|
137
|
-
async function signInWithCallback(url) {
|
|
157
|
+
async function signInWithCallback(url, expiresIn_ms = COOKIE_LIFETIME_SECONDS * 1000) {
|
|
138
158
|
const code = url.searchParams.get('code');
|
|
139
159
|
const state = url.searchParams.get('state');
|
|
140
160
|
if (!code) {
|
|
@@ -192,7 +212,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
192
212
|
};
|
|
193
213
|
}
|
|
194
214
|
const providerId = provider === 'google' ? 'google.com' : 'github.com';
|
|
195
|
-
const { data: signInData, error: signInError } = await auth.signInWithProvider(oauthToken,
|
|
215
|
+
const { data: signInData, error: signInError } = await auth.signInWithProvider(oauthToken, providerId);
|
|
196
216
|
if (signInError) {
|
|
197
217
|
return {
|
|
198
218
|
error: signInError
|
|
@@ -204,6 +224,13 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
204
224
|
};
|
|
205
225
|
}
|
|
206
226
|
if (signInData.needConfirmation) {
|
|
227
|
+
if (autoLinkProviders) {
|
|
228
|
+
// Implement auto-linking logic here
|
|
229
|
+
}
|
|
230
|
+
// const uid = await admin.getUserByEmail(email)
|
|
231
|
+
// const customToken = await createCustomToken(uid)
|
|
232
|
+
// const firebaseToken = await signInWithCustomToken(customToken)
|
|
233
|
+
// linkWithCredential(firebaseToken, providerToken, providerId)
|
|
207
234
|
return {
|
|
208
235
|
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_ACCOUNT_EXISTS_DIFFERENT_METHOD)
|
|
209
236
|
};
|
|
@@ -217,9 +244,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
217
244
|
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_ID_TOKEN)
|
|
218
245
|
};
|
|
219
246
|
}
|
|
220
|
-
const { data: sessionCookie, error: sessionError } = await adminAuth.createSessionCookie(idToken,
|
|
221
|
-
expiresIn: 60 * 60 * 24 * 5 * 1000
|
|
222
|
-
});
|
|
247
|
+
const { data: sessionCookie, error: sessionError } = await adminAuth.createSessionCookie(idToken, expiresIn_ms);
|
|
223
248
|
if (sessionError) {
|
|
224
249
|
return {
|
|
225
250
|
error: sessionError
|
|
@@ -230,7 +255,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
230
255
|
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_SESSION_COOKIE)
|
|
231
256
|
};
|
|
232
257
|
}
|
|
233
|
-
saveSession(
|
|
258
|
+
saveSession(_cookieName, sessionCookie, _cookieOptions);
|
|
234
259
|
return {
|
|
235
260
|
data: next,
|
|
236
261
|
error: null
|
|
@@ -238,8 +263,9 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
238
263
|
}
|
|
239
264
|
/**
|
|
240
265
|
* Generates fresh Firebase client tokens for the authenticated user.
|
|
266
|
+
* Creates a custom token and exchanges it for a Firebase ID token and refresh token.
|
|
241
267
|
*
|
|
242
|
-
* @returns Promise with
|
|
268
|
+
* @returns Promise resolving to object with Firebase tokens (idToken, refreshToken, expiresIn) and error if any
|
|
243
269
|
*/
|
|
244
270
|
async function getToken() {
|
|
245
271
|
const { data: verifiedToken, error: verifyError } = await getUser();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase-edge-server.js","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.js","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"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"}
|