firebase-admin-edge 1.0.19 → 1.0.21
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 +36 -48
- package/dist/auth/firebase-admin-auth.d.ts +2 -1
- package/dist/auth/firebase-admin-auth.d.ts.map +1 -1
- package/dist/auth/firebase-admin-auth.js +41 -4
- package/dist/auth/firebase-admin-auth.js.map +1 -1
- package/dist/auth/firebase-admin-auth.test.js +2 -2
- package/dist/auth/firebase-admin-auth.test.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.d.ts +13 -14
- package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -1
- package/dist/auth/firebase-auth-endpoints.js +44 -30
- package/dist/auth/firebase-auth-endpoints.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.test.js +171 -13
- package/dist/auth/firebase-auth-endpoints.test.js.map +1 -1
- package/dist/auth/firebase-auth.d.ts +2 -1
- package/dist/auth/firebase-auth.d.ts.map +1 -1
- package/dist/auth/firebase-auth.js +5 -3
- package/dist/auth/firebase-auth.js.map +1 -1
- package/dist/auth/firebase-auth.test.js +3 -3
- package/dist/auth/firebase-auth.test.js.map +1 -1
- package/dist/auth/github-oauth.d.ts.map +1 -1
- package/dist/auth/github-oauth.js +1 -1
- package/dist/auth/github-oauth.js.map +1 -1
- package/dist/auth/google-oauth.test.js.map +1 -1
- package/dist/auth/oauth.test.js +1 -1
- package/dist/auth/oauth.test.js.map +1 -1
- package/dist/firebase-edge-errors.d.ts +4 -0
- package/dist/firebase-edge-errors.d.ts.map +1 -1
- package/dist/firebase-edge-errors.js +4 -0
- package/dist/firebase-edge-errors.js.map +1 -1
- package/dist/firebase-edge-server.d.ts +9 -4
- package/dist/firebase-edge-server.d.ts.map +1 -1
- package/dist/firebase-edge-server.js +34 -21
- package/dist/firebase-edge-server.js.map +1 -1
- package/dist/firebase-edge-server.test.js +71 -13
- package/dist/firebase-edge-server.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase-edge-errors.d.ts","sourceRoot":"","sources":["../src/firebase-edge-errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B
|
|
1
|
+
{"version":3,"file":"firebase-edge-errors.d.ts","sourceRoot":"","sources":["../src/firebase-edge-errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GvC,CAAC"}
|
|
@@ -13,6 +13,10 @@ export const FirebaseEdgeServerErrorInfo = {
|
|
|
13
13
|
code: 'edge/github-provider-not-configured'
|
|
14
14
|
},
|
|
15
15
|
// OAuth Flow Errors
|
|
16
|
+
EDGE_NO_AUTHORIZATION_CODE: {
|
|
17
|
+
message: 'No authorization code provided in OAuth callback.',
|
|
18
|
+
code: 'edge/no-authorization-code'
|
|
19
|
+
},
|
|
16
20
|
EDGE_NO_PROVIDER_IN_STATE: {
|
|
17
21
|
message: 'No provider specified in state.',
|
|
18
22
|
code: 'edge/no-provider-in-state'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase-edge-errors.js","sourceRoot":"","sources":["../src/firebase-edge-errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACvC,gCAAgC;IAChC,4BAA4B,EAAE;QAC1B,OAAO,EAAE,8DAA8D;QACvE,IAAI,EAAE,8BAA8B;KACvC;IACD,mCAAmC,EAAE;QACjC,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,qCAAqC;KAC9C;IACD,mCAAmC,EAAE;QACjC,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,qCAAqC;KAC9C;IAED,oBAAoB;IACpB,yBAAyB,EAAE;QACvB,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,2BAA2B;KACpC;IACD,yBAAyB,EAAE;QACvB,OAAO,EAAE,2CAA2C;QACpD,IAAI,EAAE,2BAA2B;KACpC;IACD,mBAAmB,EAAE;QACjB,OAAO,EAAE,wCAAwC;QACjD,IAAI,EAAE,qBAAqB;KAC9B;IACD,qBAAqB,EAAE;QACnB,OAAO,EAAE,gDAAgD;QACzD,IAAI,EAAE,uBAAuB;KAChC;IACD,oBAAoB,EAAE;QAClB,OAAO,EAAE,+CAA+C;QACxD,IAAI,EAAE,sBAAsB;KAC/B;IAED,2BAA2B;IAC3B,gBAAgB,EAAE;QACd,OAAO,EAAE,oCAAoC;QAC7C,IAAI,EAAE,kBAAkB;KAC3B;IACD,sBAAsB,EAAE;QACpB,OAAO,EAAE,iDAAiD;QAC1D,IAAI,EAAE,wBAAwB;KACjC;IACD,2BAA2B,EAAE;QACzB,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,6BAA6B;KACtC;IACD,oCAAoC,EAAE;QAClC,OAAO,EAAE,iDAAiD;QAC1D,IAAI,EAAE,sCAAsC;KAC/C;IAED,4BAA4B;IAC5B,oBAAoB,EAAE;QAClB,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,sBAAsB;KAC/B;IACD,oBAAoB,EAAE;QAClB,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,sBAAsB;KAC/B;IACD,oBAAoB,EAAE;QAClB,OAAO,EAAE,uCAAuC;QAChD,IAAI,EAAE,sBAAsB;KAC/B;IAED,uBAAuB;IACvB,4BAA4B,EAAE;QAC1B,OAAO,EAAE,4DAA4D;QACrE,IAAI,EAAE,8BAA8B;KACvC;IACD,4BAA4B,EAAE;QAC1B,OAAO,EAAE,qDAAqD;QAC9D,IAAI,EAAE,8BAA8B;KACvC;IACD,6BAA6B,EAAE;QAC3B,OAAO,EAAE,2DAA2D;QACpE,IAAI,EAAE,+BAA+B;KACxC;IAED,6BAA6B;IAC7B,wBAAwB,EAAE;QACtB,OAAO,EAAE,mDAAmD;QAC5D,IAAI,EAAE,0BAA0B;KACnC;IACD,8BAA8B,EAAE;QAC5B,OAAO,EAAE,uDAAuD;QAChE,IAAI,EAAE,gCAAgC;KACzC;IAED,6BAA6B;IAC7B,iCAAiC,EAAE;QAC/B,OAAO,EAAE,6CAA6C;QACtD,IAAI,EAAE,mCAAmC;KAC5C;IACD,qBAAqB,EAAE;QACnB,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,uBAAuB;KAChC;IACD,kBAAkB,EAAE;QAChB,OAAO,EAAE,oDAAoD;QAC7D,IAAI,EAAE,oBAAoB;KAC7B;CACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"firebase-edge-errors.js","sourceRoot":"","sources":["../src/firebase-edge-errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACvC,gCAAgC;IAChC,4BAA4B,EAAE;QAC1B,OAAO,EAAE,8DAA8D;QACvE,IAAI,EAAE,8BAA8B;KACvC;IACD,mCAAmC,EAAE;QACjC,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,qCAAqC;KAC9C;IACD,mCAAmC,EAAE;QACjC,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,qCAAqC;KAC9C;IAED,oBAAoB;IACpB,0BAA0B,EAAE;QACxB,OAAO,EAAE,mDAAmD;QAC5D,IAAI,EAAE,4BAA4B;KACrC;IACD,yBAAyB,EAAE;QACvB,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,2BAA2B;KACpC;IACD,yBAAyB,EAAE;QACvB,OAAO,EAAE,2CAA2C;QACpD,IAAI,EAAE,2BAA2B;KACpC;IACD,mBAAmB,EAAE;QACjB,OAAO,EAAE,wCAAwC;QACjD,IAAI,EAAE,qBAAqB;KAC9B;IACD,qBAAqB,EAAE;QACnB,OAAO,EAAE,gDAAgD;QACzD,IAAI,EAAE,uBAAuB;KAChC;IACD,oBAAoB,EAAE;QAClB,OAAO,EAAE,+CAA+C;QACxD,IAAI,EAAE,sBAAsB;KAC/B;IAED,2BAA2B;IAC3B,gBAAgB,EAAE;QACd,OAAO,EAAE,oCAAoC;QAC7C,IAAI,EAAE,kBAAkB;KAC3B;IACD,sBAAsB,EAAE;QACpB,OAAO,EAAE,iDAAiD;QAC1D,IAAI,EAAE,wBAAwB;KACjC;IACD,2BAA2B,EAAE;QACzB,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,6BAA6B;KACtC;IACD,oCAAoC,EAAE;QAClC,OAAO,EAAE,iDAAiD;QAC1D,IAAI,EAAE,sCAAsC;KAC/C;IAED,4BAA4B;IAC5B,oBAAoB,EAAE;QAClB,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,sBAAsB;KAC/B;IACD,oBAAoB,EAAE;QAClB,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,sBAAsB;KAC/B;IACD,oBAAoB,EAAE;QAClB,OAAO,EAAE,uCAAuC;QAChD,IAAI,EAAE,sBAAsB;KAC/B;IAED,uBAAuB;IACvB,4BAA4B,EAAE;QAC1B,OAAO,EAAE,4DAA4D;QACrE,IAAI,EAAE,8BAA8B;KACvC;IACD,4BAA4B,EAAE;QAC1B,OAAO,EAAE,qDAAqD;QAC9D,IAAI,EAAE,8BAA8B;KACvC;IACD,6BAA6B,EAAE;QAC3B,OAAO,EAAE,2DAA2D;QACpE,IAAI,EAAE,+BAA+B;KACxC;IAED,6BAA6B;IAC7B,wBAAwB,EAAE;QACtB,OAAO,EAAE,mDAAmD;QAC5D,IAAI,EAAE,0BAA0B;KACnC;IACD,8BAA8B,EAAE;QAC5B,OAAO,EAAE,uDAAuD;QAChE,IAAI,EAAE,gCAAgC;KACzC;IAED,6BAA6B;IAC7B,iCAAiC,EAAE;QAC/B,OAAO,EAAE,6CAA6C;QACtD,IAAI,EAAE,mCAAmC;KAC5C;IACD,qBAAqB,EAAE;QACnB,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,uBAAuB;KAChC;IACD,kBAAkB,EAAE;QAChB,OAAO,EAAE,oDAAoD;QAC7D,IAAI,EAAE,oBAAoB;KAC7B;CACJ,CAAC"}
|
|
@@ -25,14 +25,17 @@ type CookieConfig = {
|
|
|
25
25
|
* @param config.firebaseConfig Firebase client configuration
|
|
26
26
|
* @param config.providers OAuth provider configurations (Google, GitHub, etc.)
|
|
27
27
|
* @param config.cookies Cookie management functions
|
|
28
|
+
* @param config.tenantId Optional Firebase Auth tenant ID for multi-tenancy
|
|
28
29
|
* @param config.fetch Optional custom fetch implementation
|
|
29
30
|
* @returns Object with authentication methods
|
|
30
31
|
*/
|
|
31
|
-
export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, fetch }: {
|
|
32
|
+
export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, tenantId, redirectUri, fetch }: {
|
|
32
33
|
serviceAccount: ServiceAccount;
|
|
33
34
|
firebaseConfig: FirebaseConfig;
|
|
34
35
|
providers: ProviderConfig;
|
|
35
36
|
cookies: CookieConfig;
|
|
37
|
+
redirectUri: string;
|
|
38
|
+
tenantId?: string;
|
|
36
39
|
fetch?: typeof globalThis.fetch;
|
|
37
40
|
}): {
|
|
38
41
|
auth: FirebaseAuth;
|
|
@@ -48,11 +51,13 @@ export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfi
|
|
|
48
51
|
data: import("./auth/firebase-types.js").FirebaseIdTokenPayload;
|
|
49
52
|
error: null;
|
|
50
53
|
}>;
|
|
51
|
-
getGoogleLoginURL: (
|
|
52
|
-
getGitHubLoginURL: (
|
|
53
|
-
|
|
54
|
+
getGoogleLoginURL: (next: string) => Promise<string>;
|
|
55
|
+
getGitHubLoginURL: (next: string) => Promise<string>;
|
|
56
|
+
signInWithCallback: (url: URL) => Promise<{
|
|
54
57
|
error: FirebaseEdgeError;
|
|
58
|
+
data?: undefined;
|
|
55
59
|
} | {
|
|
60
|
+
data: string;
|
|
56
61
|
error: null;
|
|
57
62
|
}>;
|
|
58
63
|
getToken: () => Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase-edge-server.d.ts","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAER,UAAU,EACV,UAAU,EACb,MAAM,wBAAwB,CAAC;AAChC,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;AAarD;;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,KAAK,YAAY,GAAG;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.d.ts","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAER,UAAU,EACV,UAAU,EACb,MAAM,wBAAwB,CAAC;AAChC,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;AAarD;;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,KAAK,YAAY,GAAG;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,cAAc,EACd,cAAc,EACd,SAAS,EACT,OAAO,EACP,QAAQ,EACR,WAAW,EACX,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,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACnC;;;;6BAwCwC,OAAO;;;;;;;;;;8BA4CL,MAAM;8BAqBN,MAAM;8BAoBN,GAAG;;;;;;;;;;;;;;;;;EA+O7C"}
|
|
@@ -35,16 +35,17 @@ export const OFFICIAL_FIREBASE_OAUTH_PROVIDERS = [
|
|
|
35
35
|
* @param config.firebaseConfig Firebase client configuration
|
|
36
36
|
* @param config.providers OAuth provider configurations (Google, GitHub, etc.)
|
|
37
37
|
* @param config.cookies Cookie management functions
|
|
38
|
+
* @param config.tenantId Optional Firebase Auth tenant ID for multi-tenancy
|
|
38
39
|
* @param config.fetch Optional custom fetch implementation
|
|
39
40
|
* @returns Object with authentication methods
|
|
40
41
|
*/
|
|
41
|
-
export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, fetch }) {
|
|
42
|
+
export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, tenantId, redirectUri, fetch }) {
|
|
42
43
|
const sessionName = cookies.sessionName || DEFAULT_SESSION_NAME;
|
|
43
44
|
const getSession = cookies.getSession;
|
|
44
45
|
const saveSession = cookies.saveSession;
|
|
45
46
|
const fetchImpl = fetch ?? globalThis.fetch;
|
|
46
|
-
const auth = new FirebaseAuth(firebaseConfig, fetchImpl);
|
|
47
|
-
const adminAuth = new FirebaseAdminAuth(serviceAccount, fetchImpl);
|
|
47
|
+
const auth = new FirebaseAuth(firebaseConfig, tenantId, fetchImpl);
|
|
48
|
+
const adminAuth = new FirebaseAdminAuth(serviceAccount, tenantId, fetchImpl);
|
|
48
49
|
/**
|
|
49
50
|
* Clears the session cookie
|
|
50
51
|
* @internal
|
|
@@ -100,45 +101,55 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
100
101
|
/**
|
|
101
102
|
* Generates a Google OAuth login URL and clears any existing session.
|
|
102
103
|
*
|
|
103
|
-
* @param
|
|
104
|
-
* @param path State parameter for the OAuth flow
|
|
104
|
+
* @param next State parameter for the OAuth flow
|
|
105
105
|
* @returns Google OAuth login URL
|
|
106
106
|
* @throws Error if Google provider not configured
|
|
107
107
|
*/
|
|
108
|
-
async function getGoogleLoginURL(
|
|
108
|
+
async function getGoogleLoginURL(next) {
|
|
109
109
|
deleteSession();
|
|
110
110
|
if (!providers.google) {
|
|
111
111
|
throw new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GOOGLE_PROVIDER_NOT_CONFIGURED);
|
|
112
112
|
}
|
|
113
113
|
const { client_id } = providers.google;
|
|
114
|
-
return createGoogleOAuthLoginUrl(
|
|
114
|
+
return createGoogleOAuthLoginUrl(redirectUri, next, client_id);
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
117
117
|
* Generates a GitHub OAuth login URL and clears any existing session.
|
|
118
118
|
*
|
|
119
|
-
* @param
|
|
120
|
-
* @param path State parameter for the OAuth flow
|
|
119
|
+
* @param next State parameter for the OAuth flow
|
|
121
120
|
* @returns GitHub OAuth login URL
|
|
122
121
|
* @throws Error if GitHub provider not configured
|
|
123
122
|
*/
|
|
124
|
-
async function getGitHubLoginURL(
|
|
123
|
+
async function getGitHubLoginURL(next) {
|
|
125
124
|
deleteSession();
|
|
126
125
|
if (!providers.github) {
|
|
127
126
|
throw new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GITHUB_PROVIDER_NOT_CONFIGURED);
|
|
128
127
|
}
|
|
129
128
|
const { client_id } = providers.github;
|
|
130
|
-
return createGitHubOAuthLoginUrl(
|
|
129
|
+
return createGitHubOAuthLoginUrl(redirectUri, next, client_id);
|
|
131
130
|
}
|
|
132
131
|
/**
|
|
133
132
|
* Completes OAuth flow by exchanging authorization code for a session.
|
|
134
133
|
*
|
|
135
|
-
* @param
|
|
136
|
-
* @param redirect_uri OAuth redirect URI (must match login URL)
|
|
137
|
-
* @param state OAuth state containing provider information
|
|
134
|
+
* @param url URL containing authorization code and state from OAuth callback
|
|
138
135
|
* @returns Promise with error information
|
|
139
136
|
*/
|
|
140
|
-
async function
|
|
141
|
-
const
|
|
137
|
+
async function signInWithCallback(url) {
|
|
138
|
+
const code = url.searchParams.get('code');
|
|
139
|
+
const state = url.searchParams.get('state');
|
|
140
|
+
if (!code) {
|
|
141
|
+
return {
|
|
142
|
+
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_AUTHORIZATION_CODE)
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
let next = '/';
|
|
146
|
+
let provider = null;
|
|
147
|
+
try {
|
|
148
|
+
const parsed = state && JSON.parse(state);
|
|
149
|
+
next = parsed?.next ?? '/';
|
|
150
|
+
provider = parsed?.provider ?? null;
|
|
151
|
+
}
|
|
152
|
+
catch { }
|
|
142
153
|
if (!provider) {
|
|
143
154
|
return {
|
|
144
155
|
error: new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_NO_PROVIDER_IN_STATE)
|
|
@@ -147,7 +158,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
147
158
|
let oauthToken = null;
|
|
148
159
|
if (providers.google && provider === 'google') {
|
|
149
160
|
const { client_id, client_secret } = providers.google;
|
|
150
|
-
const { data: googleData, error: exchangeError } = await exchangeCodeForGoogleIdToken(code,
|
|
161
|
+
const { data: googleData, error: exchangeError } = await exchangeCodeForGoogleIdToken(code, redirectUri, client_id, client_secret, fetchImpl);
|
|
151
162
|
if (exchangeError) {
|
|
152
163
|
return {
|
|
153
164
|
error: exchangeError
|
|
@@ -162,7 +173,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
162
173
|
}
|
|
163
174
|
else if (providers.github && provider === 'github') {
|
|
164
175
|
const { client_id, client_secret } = providers.github;
|
|
165
|
-
const { data: githubData, error: exchangeError } = await exchangeCodeForGitHubIdToken(code,
|
|
176
|
+
const { data: githubData, error: exchangeError } = await exchangeCodeForGitHubIdToken(code, redirectUri, client_id, client_secret, fetchImpl);
|
|
166
177
|
if (exchangeError) {
|
|
167
178
|
return {
|
|
168
179
|
error: exchangeError
|
|
@@ -181,7 +192,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
181
192
|
};
|
|
182
193
|
}
|
|
183
194
|
const providerId = provider === 'google' ? 'google.com' : 'github.com';
|
|
184
|
-
const { data: signInData, error: signInError } = await auth.signInWithProvider(oauthToken,
|
|
195
|
+
const { data: signInData, error: signInError } = await auth.signInWithProvider(oauthToken, redirectUri, providerId);
|
|
185
196
|
if (signInError) {
|
|
186
197
|
return {
|
|
187
198
|
error: signInError
|
|
@@ -221,6 +232,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
221
232
|
}
|
|
222
233
|
saveSession(sessionName, sessionCookie, COOKIE_OPTIONS);
|
|
223
234
|
return {
|
|
235
|
+
data: next,
|
|
224
236
|
error: null
|
|
225
237
|
};
|
|
226
238
|
}
|
|
@@ -243,7 +255,8 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
243
255
|
error: null
|
|
244
256
|
};
|
|
245
257
|
}
|
|
246
|
-
const
|
|
258
|
+
const claims = tenantId ? { tenant_id: tenantId } : {};
|
|
259
|
+
const { data: signJWTData, error: signJWTError } = await signJWTCustomToken(verifiedToken.sub, serviceAccount, claims);
|
|
247
260
|
if (signJWTError) {
|
|
248
261
|
return {
|
|
249
262
|
data: null,
|
|
@@ -281,7 +294,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
281
294
|
getUser,
|
|
282
295
|
getGoogleLoginURL,
|
|
283
296
|
getGitHubLoginURL,
|
|
284
|
-
|
|
297
|
+
signInWithCallback,
|
|
285
298
|
getToken
|
|
286
299
|
};
|
|
287
300
|
}
|
|
@@ -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,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EACH,yBAAyB,EACzB,yBAAyB,EAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,oBAAoB,GAAG,WAAW,CAAC;AAEzC,MAAM,cAAc,GAAG;IACnB,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI;CACjB,CAAC;AAEnB;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC7C,QAAQ;IACR,UAAU;IACV,OAAO;IACP,SAAS;IACT,QAAQ;IACR,WAAW;IACX,OAAO;IACP,WAAW;CACL,CAAC;AAoBX
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.js","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,9 @@ vi.mock('./auth/firebase-jwt.js');
|
|
|
9
9
|
vi.mock('./auth/oauth.js');
|
|
10
10
|
vi.mock('./auth/google-oauth.js');
|
|
11
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');
|
|
12
15
|
const mockServiceAccount = {
|
|
13
16
|
type: 'service_account',
|
|
14
17
|
project_id: 'test-project',
|
|
@@ -54,7 +57,8 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
54
57
|
cookies: {
|
|
55
58
|
getSession: mockGetSession,
|
|
56
59
|
saveSession: mockSaveSession
|
|
57
|
-
}
|
|
60
|
+
},
|
|
61
|
+
redirectUri: 'http://localhost'
|
|
58
62
|
});
|
|
59
63
|
});
|
|
60
64
|
describe('factory function', () => {
|
|
@@ -65,7 +69,7 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
65
69
|
expect(server).toHaveProperty('getUser');
|
|
66
70
|
expect(server).toHaveProperty('getGoogleLoginURL');
|
|
67
71
|
expect(server).toHaveProperty('getGitHubLoginURL');
|
|
68
|
-
expect(server).toHaveProperty('
|
|
72
|
+
expect(server).toHaveProperty('signInWithCallback');
|
|
69
73
|
expect(server).toHaveProperty('getToken');
|
|
70
74
|
});
|
|
71
75
|
it('uses custom session name when provided', () => {
|
|
@@ -77,7 +81,8 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
77
81
|
getSession: mockGetSession,
|
|
78
82
|
saveSession: mockSaveSession,
|
|
79
83
|
sessionName: 'custom-session'
|
|
80
|
-
}
|
|
84
|
+
},
|
|
85
|
+
redirectUri: 'http://localhost'
|
|
81
86
|
});
|
|
82
87
|
customServer.signOut();
|
|
83
88
|
expect(mockSaveSession).toHaveBeenCalledWith('custom-session', '', expect.objectContaining({ maxAge: 0 }));
|
|
@@ -96,10 +101,56 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
96
101
|
getSession: mockGetSession,
|
|
97
102
|
saveSession: mockSaveSession
|
|
98
103
|
},
|
|
104
|
+
redirectUri: 'http://localhost',
|
|
99
105
|
fetch: mockFetch
|
|
100
106
|
});
|
|
101
107
|
expect(customServer).toBeDefined();
|
|
102
108
|
});
|
|
109
|
+
it('accepts tenant ID parameter', () => {
|
|
110
|
+
const serverWithTenant = createFirebaseEdgeServer({
|
|
111
|
+
serviceAccount: mockServiceAccount,
|
|
112
|
+
firebaseConfig: mockFirebaseConfig,
|
|
113
|
+
providers: mockProviders,
|
|
114
|
+
cookies: {
|
|
115
|
+
getSession: mockGetSession,
|
|
116
|
+
saveSession: mockSaveSession
|
|
117
|
+
},
|
|
118
|
+
tenantId: 'test-tenant',
|
|
119
|
+
redirectUri: 'http://localhost'
|
|
120
|
+
});
|
|
121
|
+
expect(serverWithTenant).toBeDefined();
|
|
122
|
+
});
|
|
123
|
+
it('passes tenant ID to auth constructors', () => {
|
|
124
|
+
vi.clearAllMocks();
|
|
125
|
+
createFirebaseEdgeServer({
|
|
126
|
+
serviceAccount: mockServiceAccount,
|
|
127
|
+
firebaseConfig: mockFirebaseConfig,
|
|
128
|
+
providers: mockProviders,
|
|
129
|
+
cookies: {
|
|
130
|
+
getSession: mockGetSession,
|
|
131
|
+
saveSession: mockSaveSession
|
|
132
|
+
},
|
|
133
|
+
tenantId: 'test-tenant-id',
|
|
134
|
+
redirectUri: 'http://localhost'
|
|
135
|
+
});
|
|
136
|
+
expect(vi.mocked(FirebaseAuth)).toHaveBeenCalledWith(mockFirebaseConfig, 'test-tenant-id', globalThis.fetch);
|
|
137
|
+
expect(vi.mocked(FirebaseAdminAuth)).toHaveBeenCalledWith(mockServiceAccount, 'test-tenant-id', globalThis.fetch);
|
|
138
|
+
});
|
|
139
|
+
it('passes undefined tenant ID when not provided', () => {
|
|
140
|
+
vi.clearAllMocks();
|
|
141
|
+
createFirebaseEdgeServer({
|
|
142
|
+
serviceAccount: mockServiceAccount,
|
|
143
|
+
firebaseConfig: mockFirebaseConfig,
|
|
144
|
+
providers: mockProviders,
|
|
145
|
+
cookies: {
|
|
146
|
+
getSession: mockGetSession,
|
|
147
|
+
saveSession: mockSaveSession
|
|
148
|
+
},
|
|
149
|
+
redirectUri: 'http://localhost'
|
|
150
|
+
});
|
|
151
|
+
expect(vi.mocked(FirebaseAuth)).toHaveBeenCalledWith(mockFirebaseConfig, undefined, globalThis.fetch);
|
|
152
|
+
expect(vi.mocked(FirebaseAdminAuth)).toHaveBeenCalledWith(mockServiceAccount, undefined, globalThis.fetch);
|
|
153
|
+
});
|
|
103
154
|
});
|
|
104
155
|
describe('signOut', () => {
|
|
105
156
|
it('clears session cookie with proper options', () => {
|
|
@@ -133,14 +184,15 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
133
184
|
cookies: {
|
|
134
185
|
getSession: mockGetSession,
|
|
135
186
|
saveSession: mockSaveSession
|
|
136
|
-
}
|
|
187
|
+
},
|
|
188
|
+
redirectUri: 'http://localhost'
|
|
137
189
|
});
|
|
138
|
-
await expect(serverWithoutGoogle.getGoogleLoginURL('
|
|
190
|
+
await expect(serverWithoutGoogle.getGoogleLoginURL('/dashboard')).rejects.toThrow(new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GOOGLE_PROVIDER_NOT_CONFIGURED));
|
|
139
191
|
});
|
|
140
192
|
it('calls deleteSession before generating URL', async () => {
|
|
141
193
|
const { createGoogleOAuthLoginUrl } = await import('./auth/oauth.js');
|
|
142
194
|
vi.mocked(createGoogleOAuthLoginUrl).mockReturnValue('http://oauth-url');
|
|
143
|
-
await server.getGoogleLoginURL('
|
|
195
|
+
await server.getGoogleLoginURL('/dashboard');
|
|
144
196
|
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', expect.objectContaining({ maxAge: 0 }));
|
|
145
197
|
});
|
|
146
198
|
});
|
|
@@ -153,20 +205,22 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
153
205
|
cookies: {
|
|
154
206
|
getSession: mockGetSession,
|
|
155
207
|
saveSession: mockSaveSession
|
|
156
|
-
}
|
|
208
|
+
},
|
|
209
|
+
redirectUri: 'http://localhost'
|
|
157
210
|
});
|
|
158
|
-
await expect(serverWithoutGitHub.getGitHubLoginURL('
|
|
211
|
+
await expect(serverWithoutGitHub.getGitHubLoginURL('/dashboard')).rejects.toThrow(new FirebaseEdgeError(FirebaseEdgeServerErrorInfo.EDGE_GITHUB_PROVIDER_NOT_CONFIGURED));
|
|
159
212
|
});
|
|
160
213
|
it('calls deleteSession before generating URL', async () => {
|
|
161
214
|
const { createGitHubOAuthLoginUrl } = await import('./auth/oauth.js');
|
|
162
215
|
vi.mocked(createGitHubOAuthLoginUrl).mockReturnValue('http://github-oauth-url');
|
|
163
|
-
await server.getGitHubLoginURL('
|
|
216
|
+
await server.getGitHubLoginURL('/dashboard');
|
|
164
217
|
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', expect.objectContaining({ maxAge: 0 }));
|
|
165
218
|
});
|
|
166
219
|
});
|
|
167
|
-
describe('
|
|
220
|
+
describe('signInWithCallback', () => {
|
|
168
221
|
it('returns error when no provider specified in state', async () => {
|
|
169
|
-
const
|
|
222
|
+
const url = new URL('http://localhost/callback?code=auth-code');
|
|
223
|
+
const result = await server.signInWithCallback(url);
|
|
170
224
|
expect(result).toEqual({
|
|
171
225
|
error: expect.any(FirebaseEdgeError)
|
|
172
226
|
});
|
|
@@ -174,8 +228,12 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
174
228
|
expect(result.error.code).toBe(FirebaseEdgeServerErrorInfo.EDGE_NO_PROVIDER_IN_STATE.code);
|
|
175
229
|
});
|
|
176
230
|
it('handles invalid JSON state gracefully', async () => {
|
|
177
|
-
|
|
178
|
-
await
|
|
231
|
+
const url = new URL('http://localhost/callback?code=auth-code&state=invalid-json');
|
|
232
|
+
const result = await server.signInWithCallback(url);
|
|
233
|
+
expect(result).toEqual({
|
|
234
|
+
error: expect.any(FirebaseEdgeError)
|
|
235
|
+
});
|
|
236
|
+
expect(result.error).toBeInstanceOf(FirebaseEdgeError);
|
|
179
237
|
});
|
|
180
238
|
});
|
|
181
239
|
describe('getToken', () => {
|
|
@@ -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;AAEnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,oBAAoB;AACpB,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;AACzC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AACnC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAClC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3B,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAClC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAElC,MAAM,kBAAkB,GAAmB;IACvC,IAAI,EAAE,iBAAiB;IACvB,UAAU,EAAE,cAAc;IAC1B,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,2CAA2C;IACzD,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,2CAA2C;IACrD,SAAS,EAAE,qCAAqC;IAChD,2BAA2B,EAAE,4CAA4C;IACzE,oBAAoB,EAChB,+FAA+F;CACtG,CAAC;AAEF,MAAM,kBAAkB,GAAmB;IACvC,MAAM,EAAE,cAAc;IACtB,UAAU,EAAE,8BAA8B;IAC1C,SAAS,EAAE,cAAc;IACzB,aAAa,EAAE,0BAA0B;IACzC,iBAAiB,EAAE,WAAW;IAC9B,KAAK,EAAE,aAAa;CACvB,CAAC;AAEF,MAAM,aAAa,GAAG;IAClB,MAAM,EAAE;QACJ,SAAS,EAAE,kBAAkB;QAC7B,aAAa,EAAE,sBAAsB;KACxC;IACD,MAAM,EAAE;QACJ,SAAS,EAAE,kBAAkB;QAC7B,aAAa,EAAE,sBAAsB;KACxC;CACJ,CAAC;AAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACtC,IAAI,cAAoB,CAAC;IACzB,IAAI,eAAqB,CAAC;IAC1B,IAAI,MAAmD,CAAC;IAExD,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAE1B,MAAM,GAAG,wBAAwB,CAAC;YAC9B,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,kBAAkB;YAClC,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE;gBACL,UAAU,EAAE,cAAc;gBAC1B,WAAW,EAAE,eAAe;aAC/B;
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.test.js","sourceRoot":"","sources":["../src/firebase-edge-server.test.ts"],"names":[],"mappings":"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"}
|