firebase-admin-edge 1.0.11 → 1.0.12
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 +18 -7
- package/dist/auth/github-oauth.d.ts +16 -0
- package/dist/auth/github-oauth.d.ts.map +1 -0
- package/dist/auth/github-oauth.js +31 -0
- package/dist/auth/github-oauth.js.map +1 -0
- package/dist/auth/google-oauth.d.ts.map +1 -1
- package/dist/auth/google-oauth.js +1 -0
- package/dist/auth/google-oauth.js.map +1 -1
- package/dist/auth/google-oauth.test.js +1 -0
- package/dist/auth/google-oauth.test.js.map +1 -1
- package/dist/firebase-edge-server.d.ts +15 -58
- package/dist/firebase-edge-server.d.ts.map +1 -1
- package/dist/firebase-edge-server.js +82 -253
- package/dist/firebase-edge-server.js.map +1 -1
- package/dist/firebase-edge-server.test.js +103 -64
- package/dist/firebase-edge-server.test.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -53,35 +53,46 @@ export const firebaseServer = createFirebaseEdgeServer({
|
|
|
53
53
|
});
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
**Get User**
|
|
57
57
|
|
|
58
58
|
```ts
|
|
59
59
|
const { data: user } = await firebaseServer.getUser();
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
**Login with Code**
|
|
63
63
|
|
|
64
64
|
```ts
|
|
65
|
-
// Currently only supports
|
|
65
|
+
// Currently only supports GitHub and Google login
|
|
66
66
|
|
|
67
|
-
const
|
|
67
|
+
const code = url.searchParams.get('code');
|
|
68
|
+
const state = url.searchParams.get('state');
|
|
69
|
+
|
|
70
|
+
const { error } = await firebaseServer.signInWithCode(
|
|
68
71
|
code,
|
|
69
72
|
redirect_uri,
|
|
73
|
+
state,
|
|
70
74
|
);
|
|
71
75
|
```
|
|
72
76
|
|
|
73
|
-
|
|
77
|
+
**Create Login URL**
|
|
74
78
|
|
|
75
79
|
```ts
|
|
76
|
-
//
|
|
80
|
+
// You don't need a browser with this library!
|
|
81
|
+
|
|
82
|
+
// path - where you want to redirect to after login
|
|
83
|
+
// redirect_uri - is the oAuth redirect url
|
|
77
84
|
|
|
78
85
|
const loginUrl = await firebaseServer.getGoogleLoginURL(redirect_uri, path);
|
|
79
86
|
|
|
87
|
+
// OR
|
|
88
|
+
|
|
89
|
+
const loginURL = await firebaseServer.getGitHubLoginURL(redirect_uri, path);
|
|
90
|
+
|
|
80
91
|
// Your framework redirect method
|
|
81
92
|
redirect(302, loginUrl);
|
|
82
93
|
```
|
|
83
94
|
|
|
84
|
-
|
|
95
|
+
**Logout**
|
|
85
96
|
|
|
86
97
|
```ts
|
|
87
98
|
firebaseServer.signOut();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type GithubTokenResponse = {
|
|
2
|
+
access_token: string;
|
|
3
|
+
token_type: string;
|
|
4
|
+
scope: string;
|
|
5
|
+
};
|
|
6
|
+
export type GithubOAuthError = {
|
|
7
|
+
error: string;
|
|
8
|
+
error_description?: string;
|
|
9
|
+
error_uri?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function createGitHubOAuthLoginUrl(redirect_uri: string, path: string, client_id: string): string;
|
|
12
|
+
export declare function exchangeCodeForGitHubIdToken(code: string, redirect_uri: string, client_id: string, client_secret: string, fetchFn?: typeof globalThis.fetch): Promise<{
|
|
13
|
+
data: GithubTokenResponse | null;
|
|
14
|
+
error: string | null;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=github-oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-oauth.d.ts","sourceRoot":"","sources":["../../src/auth/github-oauth.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,yBAAyB,CACrC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,UAcpB;AAED,wBAAsB,4BAA4B,CAC9C,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK;;;GAsBpC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { restFetch } from '../rest-fetch.js';
|
|
2
|
+
export function createGitHubOAuthLoginUrl(redirect_uri, path, client_id) {
|
|
3
|
+
return new URL('https://github.com/login/oauth/authorize?' +
|
|
4
|
+
new URLSearchParams({
|
|
5
|
+
client_id,
|
|
6
|
+
redirect_uri,
|
|
7
|
+
scope: 'read:user user:email',
|
|
8
|
+
state: JSON.stringify({
|
|
9
|
+
next: path,
|
|
10
|
+
provider: 'github',
|
|
11
|
+
}),
|
|
12
|
+
}).toString()).toString();
|
|
13
|
+
}
|
|
14
|
+
export async function exchangeCodeForGitHubIdToken(code, redirect_uri, client_id, client_secret, fetchFn) {
|
|
15
|
+
const url = 'https://github.com/login/oauth/access_token';
|
|
16
|
+
const { data, error } = await restFetch(url, {
|
|
17
|
+
global: { fetch: fetchFn },
|
|
18
|
+
body: {
|
|
19
|
+
code,
|
|
20
|
+
client_id,
|
|
21
|
+
client_secret,
|
|
22
|
+
redirect_uri,
|
|
23
|
+
},
|
|
24
|
+
form: true,
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
data,
|
|
28
|
+
error: error ? error.error : null,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=github-oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-oauth.js","sourceRoot":"","sources":["../../src/auth/github-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAc7C,MAAM,UAAU,yBAAyB,CACrC,YAAoB,EACpB,IAAY,EACZ,SAAiB;IAEjB,OAAO,IAAI,GAAG,CACV,2CAA2C;QACvC,IAAI,eAAe,CAAC;YAChB,SAAS;YACT,YAAY;YACZ,KAAK,EAAE,sBAAsB;YAC7B,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;gBAClB,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,QAAQ;aACrB,CAAC;SACL,CAAC,CAAC,QAAQ,EAAE,CACpB,CAAC,QAAQ,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAC9C,IAAY,EACZ,YAAoB,EACpB,SAAiB,EACjB,aAAqB,EACrB,OAAiC;IAEjC,MAAM,GAAG,GAAG,6CAA6C,CAAC;IAE1D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAGrC,GAAG,EAAE;QACH,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;QAC1B,IAAI,EAAE;YACF,IAAI;YACJ,SAAS;YACT,aAAa;YACb,YAAY;SACf;QACD,IAAI,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,OAAO;QACH,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;KACpC,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-oauth.d.ts","sourceRoot":"","sources":["../../src/auth/google-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAER,mBAAmB,EACnB,cAAc,EACjB,MAAM,qBAAqB,CAAC;AAI7B,wBAAgB,yBAAyB,CACrC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"google-oauth.d.ts","sourceRoot":"","sources":["../../src/auth/google-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAER,mBAAmB,EACnB,cAAc,EACjB,MAAM,qBAAqB,CAAC;AAI7B,wBAAgB,yBAAyB,CACrC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,UAiBpB;AAED,wBAAsB,4BAA4B,CAC9C,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK;;;;;;;;;;;GAuBpC;AAED,wBAAsB,QAAQ,CAC1B,cAAc,EAAE,cAAc,EAC9B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK;;;;;;;;;;;;;;;;GAmElC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-oauth.js","sourceRoot":"","sources":["../../src/auth/google-oauth.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,UAAU,yBAAyB,CACrC,YAAoB,EACpB,IAAY,EACZ,SAAiB;IAEjB,OAAO,IAAI,GAAG,CACV,+CAA+C;QAC3C,IAAI,eAAe,CAAC;YAChB,SAAS;YACT,YAAY;YACZ,aAAa,EAAE,MAAM;YACrB,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;gBAClB,IAAI,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"google-oauth.js","sourceRoot":"","sources":["../../src/auth/google-oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-oauth.test.js","sourceRoot":"","sources":["../../src/auth/google-oauth.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"google-oauth.test.js","sourceRoot":"","sources":["../../src/auth/google-oauth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,9 @@ 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
|
/**
|
|
6
|
-
* Official Firebase OAuth providers
|
|
7
|
-
* @constant
|
|
8
|
-
* @type {readonly string[]}
|
|
6
|
+
* Official Firebase OAuth providers
|
|
9
7
|
*/
|
|
10
|
-
export declare const OFFICIAL_FIREBASE_OAUTH_PROVIDERS: readonly
|
|
8
|
+
export declare const OFFICIAL_FIREBASE_OAUTH_PROVIDERS: readonly ["google", "facebook", "apple", "twitter", "github", "microsoft", "yahoo", "playgames"];
|
|
11
9
|
type ProviderList = (typeof OFFICIAL_FIREBASE_OAUTH_PROVIDERS)[number];
|
|
12
10
|
type ProviderConfig = Partial<Record<ProviderList, {
|
|
13
11
|
client_id: string;
|
|
@@ -19,60 +17,15 @@ type CookieConfig = {
|
|
|
19
17
|
sessionName?: string;
|
|
20
18
|
};
|
|
21
19
|
/**
|
|
22
|
-
* Creates a Firebase Edge Server
|
|
20
|
+
* Creates a Firebase Edge Server for authentication and session management in edge environments.
|
|
23
21
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @param config
|
|
28
|
-
* @param config.
|
|
29
|
-
* @param config.
|
|
30
|
-
* @
|
|
31
|
-
* @param config.cookies - Cookie management configuration for session handling
|
|
32
|
-
* @param config.fetch - Optional custom fetch implementation (defaults to globalThis.fetch)
|
|
33
|
-
*
|
|
34
|
-
* @returns Object containing authentication methods and utilities
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```typescript
|
|
38
|
-
* const server = createFirebaseEdgeServer({
|
|
39
|
-
* serviceAccount: {
|
|
40
|
-
* type: "service_account",
|
|
41
|
-
* project_id: "your-project-id",
|
|
42
|
-
* private_key_id: "...",
|
|
43
|
-
* private_key: "...",
|
|
44
|
-
* client_email: "...",
|
|
45
|
-
* client_id: "...",
|
|
46
|
-
* auth_uri: "...",
|
|
47
|
-
* token_uri: "...",
|
|
48
|
-
* auth_provider_x509_cert_url: "...",
|
|
49
|
-
* client_x509_cert_url: "..."
|
|
50
|
-
* },
|
|
51
|
-
* firebaseConfig: {
|
|
52
|
-
* apiKey: "your-api-key",
|
|
53
|
-
* authDomain: "your-project.firebaseapp.com",
|
|
54
|
-
* projectId: "your-project-id"
|
|
55
|
-
* },
|
|
56
|
-
* providers: {
|
|
57
|
-
* google: {
|
|
58
|
-
* client_id: "your-google-client-id",
|
|
59
|
-
* client_secret: "your-google-client-secret"
|
|
60
|
-
* }
|
|
61
|
-
* },
|
|
62
|
-
* cookies: {
|
|
63
|
-
* getSession: (name) => getCookie(name),
|
|
64
|
-
* saveSession: (name, value, options) => setCookie(name, value, options)
|
|
65
|
-
* }
|
|
66
|
-
* });
|
|
67
|
-
*
|
|
68
|
-
* // Using guard clauses for clean error handling
|
|
69
|
-
* const { data: user, error } = await server.getUser();
|
|
70
|
-
* if (error) return handleError(error);
|
|
71
|
-
* if (!user) return redirectToLogin();
|
|
72
|
-
*
|
|
73
|
-
* // User is authenticated, proceed with protected logic
|
|
74
|
-
* console.log('Authenticated user:', user.email);
|
|
75
|
-
* ```
|
|
22
|
+
* @param config Configuration object
|
|
23
|
+
* @param config.serviceAccount Firebase service account for admin operations
|
|
24
|
+
* @param config.firebaseConfig Firebase client configuration
|
|
25
|
+
* @param config.providers OAuth provider configurations (Google, GitHub, etc.)
|
|
26
|
+
* @param config.cookies Cookie management functions
|
|
27
|
+
* @param config.fetch Optional custom fetch implementation
|
|
28
|
+
* @returns Object with authentication methods
|
|
76
29
|
*/
|
|
77
30
|
export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, fetch, }: {
|
|
78
31
|
serviceAccount: ServiceAccount;
|
|
@@ -105,7 +58,11 @@ export declare function createFirebaseEdgeServer({ serviceAccount, firebaseConfi
|
|
|
105
58
|
error: null;
|
|
106
59
|
}>;
|
|
107
60
|
getGoogleLoginURL: (redirect_uri: string, path: string) => Promise<string>;
|
|
108
|
-
|
|
61
|
+
getGitHubLoginURL: (redirect_uri: string, path: string) => Promise<string>;
|
|
62
|
+
signInWithCode: (code: string, redirect_uri: string, state?: string | null) => Promise<{
|
|
63
|
+
error: string;
|
|
64
|
+
data?: undefined;
|
|
65
|
+
} | {
|
|
109
66
|
data: null;
|
|
110
67
|
error: {
|
|
111
68
|
code: number;
|
|
@@ -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;
|
|
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;AAoB/E;;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;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,cAAc,EACd,cAAc,EACd,SAAS,EACT,OAAO,EACP,KAAK,GACR,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,OAAO,UAAU,CAAC,KAAK,CAAC;CACnC;;;;6BAoCwC,OAAO;;;;;;;;;;;;;;;;;;;;sCA6CG,MAAM,QAAQ,MAAM;sCAoBpB,MAAM,QAAQ,MAAM;2BAqBzD,MAAM,gBACE,MAAM,UACb,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuL3B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
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 { createGitHubOAuthLoginUrl, exchangeCodeForGitHubIdToken, } from './auth/github-oauth.js';
|
|
4
5
|
import { createGoogleOAuthLoginUrl, exchangeCodeForGoogleIdToken, } from './auth/google-oauth.js';
|
|
5
6
|
const DEFAULT_SESSION_NAME = '__session';
|
|
6
7
|
const COOKIE_OPTIONS = {
|
|
@@ -11,9 +12,7 @@ const COOKIE_OPTIONS = {
|
|
|
11
12
|
maxAge: 60 * 60 * 24 * 5 * 1000,
|
|
12
13
|
};
|
|
13
14
|
/**
|
|
14
|
-
* Official Firebase OAuth providers
|
|
15
|
-
* @constant
|
|
16
|
-
* @type {readonly string[]}
|
|
15
|
+
* Official Firebase OAuth providers
|
|
17
16
|
*/
|
|
18
17
|
export const OFFICIAL_FIREBASE_OAUTH_PROVIDERS = [
|
|
19
18
|
'google',
|
|
@@ -26,60 +25,15 @@ export const OFFICIAL_FIREBASE_OAUTH_PROVIDERS = [
|
|
|
26
25
|
'playgames',
|
|
27
26
|
];
|
|
28
27
|
/**
|
|
29
|
-
* Creates a Firebase Edge Server
|
|
28
|
+
* Creates a Firebase Edge Server for authentication and session management in edge environments.
|
|
30
29
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* @param config
|
|
35
|
-
* @param config.
|
|
36
|
-
* @param config.
|
|
37
|
-
* @
|
|
38
|
-
* @param config.cookies - Cookie management configuration for session handling
|
|
39
|
-
* @param config.fetch - Optional custom fetch implementation (defaults to globalThis.fetch)
|
|
40
|
-
*
|
|
41
|
-
* @returns Object containing authentication methods and utilities
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```typescript
|
|
45
|
-
* const server = createFirebaseEdgeServer({
|
|
46
|
-
* serviceAccount: {
|
|
47
|
-
* type: "service_account",
|
|
48
|
-
* project_id: "your-project-id",
|
|
49
|
-
* private_key_id: "...",
|
|
50
|
-
* private_key: "...",
|
|
51
|
-
* client_email: "...",
|
|
52
|
-
* client_id: "...",
|
|
53
|
-
* auth_uri: "...",
|
|
54
|
-
* token_uri: "...",
|
|
55
|
-
* auth_provider_x509_cert_url: "...",
|
|
56
|
-
* client_x509_cert_url: "..."
|
|
57
|
-
* },
|
|
58
|
-
* firebaseConfig: {
|
|
59
|
-
* apiKey: "your-api-key",
|
|
60
|
-
* authDomain: "your-project.firebaseapp.com",
|
|
61
|
-
* projectId: "your-project-id"
|
|
62
|
-
* },
|
|
63
|
-
* providers: {
|
|
64
|
-
* google: {
|
|
65
|
-
* client_id: "your-google-client-id",
|
|
66
|
-
* client_secret: "your-google-client-secret"
|
|
67
|
-
* }
|
|
68
|
-
* },
|
|
69
|
-
* cookies: {
|
|
70
|
-
* getSession: (name) => getCookie(name),
|
|
71
|
-
* saveSession: (name, value, options) => setCookie(name, value, options)
|
|
72
|
-
* }
|
|
73
|
-
* });
|
|
74
|
-
*
|
|
75
|
-
* // Using guard clauses for clean error handling
|
|
76
|
-
* const { data: user, error } = await server.getUser();
|
|
77
|
-
* if (error) return handleError(error);
|
|
78
|
-
* if (!user) return redirectToLogin();
|
|
79
|
-
*
|
|
80
|
-
* // User is authenticated, proceed with protected logic
|
|
81
|
-
* console.log('Authenticated user:', user.email);
|
|
82
|
-
* ```
|
|
30
|
+
* @param config Configuration object
|
|
31
|
+
* @param config.serviceAccount Firebase service account for admin operations
|
|
32
|
+
* @param config.firebaseConfig Firebase client configuration
|
|
33
|
+
* @param config.providers OAuth provider configurations (Google, GitHub, etc.)
|
|
34
|
+
* @param config.cookies Cookie management functions
|
|
35
|
+
* @param config.fetch Optional custom fetch implementation
|
|
36
|
+
* @returns Object with authentication methods
|
|
83
37
|
*/
|
|
84
38
|
export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, providers, cookies, fetch, }) {
|
|
85
39
|
const sessionName = cookies.sessionName || DEFAULT_SESSION_NAME;
|
|
@@ -89,11 +43,7 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
89
43
|
const auth = new FirebaseAuth(firebaseConfig, fetchImpl);
|
|
90
44
|
const adminAuth = new FirebaseAdminAuth(serviceAccount, fetchImpl);
|
|
91
45
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* This is an internal helper function used by signOut and error handlers to ensure
|
|
95
|
-
* clean session management when authentication fails or users sign out.
|
|
96
|
-
*
|
|
46
|
+
* Clears the session cookie
|
|
97
47
|
* @internal
|
|
98
48
|
*/
|
|
99
49
|
function deleteSession() {
|
|
@@ -103,57 +53,18 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
103
53
|
});
|
|
104
54
|
}
|
|
105
55
|
/**
|
|
106
|
-
* Signs out the current user by
|
|
107
|
-
*
|
|
108
|
-
* This method only removes the local session and does not revoke the user's Firebase tokens.
|
|
109
|
-
* For complete logout, consider also calling Firebase client-side signOut if needed.
|
|
110
|
-
*
|
|
111
|
-
* @example
|
|
112
|
-
* ```typescript
|
|
113
|
-
* // Simple sign out
|
|
114
|
-
* server.signOut();
|
|
115
|
-
*
|
|
116
|
-
* // With redirect after sign out
|
|
117
|
-
* server.signOut();
|
|
118
|
-
* return redirect('/login');
|
|
119
|
-
* ```
|
|
56
|
+
* Signs out the current user by clearing the session cookie.
|
|
57
|
+
* Note: This only removes the server-side session, not Firebase client tokens.
|
|
120
58
|
*/
|
|
121
59
|
function signOut() {
|
|
122
60
|
deleteSession();
|
|
123
61
|
return;
|
|
124
62
|
}
|
|
125
63
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* Validates the session cookie and returns the decoded user token. If the session
|
|
129
|
-
* is invalid or expired, automatically cleans up the session cookie.
|
|
130
|
-
*
|
|
131
|
-
* @param checkRevoked - Whether to check if the user's token has been revoked (default: false)
|
|
132
|
-
* @returns Promise resolving to user data and error information
|
|
64
|
+
* Gets the current authenticated user from the session cookie.
|
|
133
65
|
*
|
|
134
|
-
* @
|
|
135
|
-
*
|
|
136
|
-
* // Using guard clauses for clean error handling
|
|
137
|
-
* const { data: user, error } = await server.getUser();
|
|
138
|
-
* if (error) {
|
|
139
|
-
* console.error('Authentication error:', error);
|
|
140
|
-
* return redirect('/login');
|
|
141
|
-
* }
|
|
142
|
-
*
|
|
143
|
-
* if (!user) {
|
|
144
|
-
* console.log('No user session found');
|
|
145
|
-
* return redirect('/login');
|
|
146
|
-
* }
|
|
147
|
-
*
|
|
148
|
-
* // User is authenticated, proceed safely
|
|
149
|
-
* console.log('User ID:', user.sub);
|
|
150
|
-
* console.log('Email:', user.email);
|
|
151
|
-
* console.log('Email verified:', user.email_verified);
|
|
152
|
-
*
|
|
153
|
-
* // Check for revoked tokens in sensitive operations
|
|
154
|
-
* const { data: verifiedUser, error: revokeError } = await server.getUser(true);
|
|
155
|
-
* if (revokeError) return handleRevokedToken();
|
|
156
|
-
* ```
|
|
66
|
+
* @param checkRevoked Whether to check if the token has been revoked
|
|
67
|
+
* @returns Promise with user data and error
|
|
157
68
|
*/
|
|
158
69
|
async function getUser(checkRevoked = false) {
|
|
159
70
|
const sessionCookie = await getSession(sessionName);
|
|
@@ -184,45 +95,12 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
184
95
|
};
|
|
185
96
|
}
|
|
186
97
|
/**
|
|
187
|
-
* Generates a Google OAuth login URL
|
|
188
|
-
*
|
|
189
|
-
* Automatically clears any existing session before generating the URL to ensure
|
|
190
|
-
* a clean authentication flow. The generated URL will redirect users to Google's
|
|
191
|
-
* OAuth consent screen.
|
|
192
|
-
*
|
|
193
|
-
* @param redirect_uri - The URI to redirect to after Google authentication (must be registered in Google Console)
|
|
194
|
-
* @param path - Additional path parameter for the OAuth flow state management
|
|
195
|
-
* @returns Promise resolving to the Google OAuth login URL
|
|
196
|
-
*
|
|
197
|
-
* @throws {Error} If Google provider is not configured in the providers config
|
|
98
|
+
* Generates a Google OAuth login URL and clears any existing session.
|
|
198
99
|
*
|
|
199
|
-
* @
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* const loginUrl = await server.getGoogleLoginURL(
|
|
204
|
-
* 'https://yourapp.com/auth/callback',
|
|
205
|
-
* '/dashboard'
|
|
206
|
-
* );
|
|
207
|
-
* return redirect(loginUrl);
|
|
208
|
-
* } catch (error) {
|
|
209
|
-
* console.error('Google OAuth not configured:', error);
|
|
210
|
-
* return errorResponse('OAuth unavailable');
|
|
211
|
-
* }
|
|
212
|
-
*
|
|
213
|
-
* // In a route handler
|
|
214
|
-
* export async function GET(request: Request) {
|
|
215
|
-
* const url = new URL(request.url);
|
|
216
|
-
* const returnTo = url.searchParams.get('returnTo') || '/dashboard';
|
|
217
|
-
*
|
|
218
|
-
* const loginUrl = await server.getGoogleLoginURL(
|
|
219
|
-
* `${url.origin}/auth/callback`,
|
|
220
|
-
* returnTo
|
|
221
|
-
* );
|
|
222
|
-
*
|
|
223
|
-
* return redirect(loginUrl);
|
|
224
|
-
* }
|
|
225
|
-
* ```
|
|
100
|
+
* @param redirect_uri OAuth redirect URI
|
|
101
|
+
* @param path State parameter for the OAuth flow
|
|
102
|
+
* @returns Google OAuth login URL
|
|
103
|
+
* @throws Error if Google provider not configured
|
|
226
104
|
*/
|
|
227
105
|
async function getGoogleLoginURL(redirect_uri, path) {
|
|
228
106
|
deleteSession();
|
|
@@ -233,74 +111,73 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
233
111
|
return createGoogleOAuthLoginUrl(redirect_uri, path, client_id);
|
|
234
112
|
}
|
|
235
113
|
/**
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
* This method should be called in your OAuth callback handler to complete the authentication
|
|
239
|
-
* flow initiated by getGoogleLoginURL. It exchanges the authorization code for tokens,
|
|
240
|
-
* creates a Firebase session, and sets the session cookie.
|
|
241
|
-
*
|
|
242
|
-
* @param code - The authorization code received from Google OAuth callback
|
|
243
|
-
* @param redirect_uri - The redirect URI used in the OAuth flow (must match the one used in getGoogleLoginURL)
|
|
244
|
-
* @returns Promise resolving to success/error information
|
|
114
|
+
* Generates a GitHub OAuth login URL and clears any existing session.
|
|
245
115
|
*
|
|
246
|
-
* @
|
|
247
|
-
*
|
|
248
|
-
*
|
|
249
|
-
*
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
*
|
|
261
|
-
* code,
|
|
262
|
-
* `${url.origin}/auth/callback`
|
|
263
|
-
* );
|
|
264
|
-
*
|
|
265
|
-
* if (error) {
|
|
266
|
-
* console.error('Sign in failed:', error.message);
|
|
267
|
-
* return redirect('/login?error=auth_failed');
|
|
268
|
-
* }
|
|
269
|
-
*
|
|
270
|
-
* // Success - redirect to protected area
|
|
271
|
-
* const redirectTo = state || '/dashboard';
|
|
272
|
-
* return redirect(redirectTo);
|
|
273
|
-
* }
|
|
116
|
+
* @param redirect_uri OAuth redirect URI
|
|
117
|
+
* @param path State parameter for the OAuth flow
|
|
118
|
+
* @returns GitHub OAuth login URL
|
|
119
|
+
* @throws Error if GitHub provider not configured
|
|
120
|
+
*/
|
|
121
|
+
async function getGitHubLoginURL(redirect_uri, path) {
|
|
122
|
+
deleteSession();
|
|
123
|
+
if (!providers.github) {
|
|
124
|
+
throw new Error('GitHub provider not configured');
|
|
125
|
+
}
|
|
126
|
+
const { client_id } = providers.github;
|
|
127
|
+
return createGitHubOAuthLoginUrl(redirect_uri, path, client_id);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Completes OAuth flow by exchanging authorization code for a session.
|
|
274
131
|
*
|
|
275
|
-
*
|
|
276
|
-
*
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
* }
|
|
280
|
-
* if (error?.message.includes('invalid_grant')) {
|
|
281
|
-
* return handleExpiredCode();
|
|
282
|
-
* }
|
|
283
|
-
* ```
|
|
132
|
+
* @param code Authorization code from OAuth provider
|
|
133
|
+
* @param redirect_uri OAuth redirect URI (must match login URL)
|
|
134
|
+
* @param state OAuth state containing provider information
|
|
135
|
+
* @returns Promise with error information
|
|
284
136
|
*/
|
|
285
|
-
async function
|
|
286
|
-
|
|
137
|
+
async function signInWithCode(code, redirect_uri, state = null) {
|
|
138
|
+
const provider = state ? JSON.parse(state).provider : null;
|
|
139
|
+
if (!provider) {
|
|
287
140
|
return {
|
|
288
|
-
error: new Error('
|
|
141
|
+
error: new Error('No provider specified in state'),
|
|
289
142
|
};
|
|
290
143
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
144
|
+
let oauthToken = null;
|
|
145
|
+
if (providers.google && provider === 'google') {
|
|
146
|
+
const { client_id, client_secret } = providers.google;
|
|
147
|
+
const { data: googleData, error: exchangeError } = await exchangeCodeForGoogleIdToken(code, redirect_uri, client_id, client_secret, fetchImpl);
|
|
148
|
+
if (exchangeError) {
|
|
149
|
+
return {
|
|
150
|
+
error: exchangeError,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (!googleData) {
|
|
154
|
+
return {
|
|
155
|
+
error: new Error('No exchange data!'),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
oauthToken = googleData.id_token;
|
|
297
159
|
}
|
|
298
|
-
if (
|
|
160
|
+
else if (providers.github && provider === 'github') {
|
|
161
|
+
const { client_id, client_secret } = providers.github;
|
|
162
|
+
const { data: githubData, error: exchangeError } = await exchangeCodeForGitHubIdToken(code, redirect_uri, client_id, client_secret, fetchImpl);
|
|
163
|
+
if (exchangeError) {
|
|
164
|
+
return {
|
|
165
|
+
error: exchangeError,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
if (!githubData) {
|
|
169
|
+
return {
|
|
170
|
+
error: new Error('No exchange data!'),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
oauthToken = githubData.access_token;
|
|
174
|
+
}
|
|
175
|
+
if (!oauthToken) {
|
|
299
176
|
return {
|
|
300
|
-
error: new Error('No
|
|
177
|
+
error: new Error('No OAuth token obtained'),
|
|
301
178
|
};
|
|
302
179
|
}
|
|
303
|
-
const { data: signInData, error: signInError } = await auth.signInWithProvider(
|
|
180
|
+
const { data: signInData, error: signInError } = await auth.signInWithProvider(oauthToken, redirect_uri);
|
|
304
181
|
if (signInError) {
|
|
305
182
|
return {
|
|
306
183
|
data: null,
|
|
@@ -332,46 +209,9 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
332
209
|
};
|
|
333
210
|
}
|
|
334
211
|
/**
|
|
335
|
-
* Generates
|
|
336
|
-
*
|
|
337
|
-
* This method creates new Firebase client tokens that can be used for authenticated
|
|
338
|
-
* requests to Firebase services from the client-side. The tokens are generated using
|
|
339
|
-
* the user's server-side session.
|
|
340
|
-
*
|
|
341
|
-
* @returns Promise resolving to token data (accessToken, refreshToken, etc.) and error information
|
|
342
|
-
*
|
|
343
|
-
* @example
|
|
344
|
-
* ```typescript
|
|
345
|
-
* // Using guard clauses for clean token handling
|
|
346
|
-
* const { data: tokenData, error } = await server.getToken();
|
|
347
|
-
* if (error) {
|
|
348
|
-
* console.error('Token generation failed:', error.message);
|
|
349
|
-
* return redirect('/login');
|
|
350
|
-
* }
|
|
351
|
-
*
|
|
352
|
-
* if (!tokenData) {
|
|
353
|
-
* console.log('No user session for token generation');
|
|
354
|
-
* return redirect('/login');
|
|
355
|
-
* }
|
|
356
|
-
*
|
|
357
|
-
* // Tokens are ready for client use
|
|
358
|
-
* const response = {
|
|
359
|
-
* accessToken: tokenData.accessToken,
|
|
360
|
-
* refreshToken: tokenData.refreshToken,
|
|
361
|
-
* expiresIn: tokenData.expiresIn
|
|
362
|
-
* };
|
|
212
|
+
* Generates fresh Firebase client tokens for the authenticated user.
|
|
363
213
|
*
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
* // Using tokens for Firebase client initialization
|
|
367
|
-
* const auth = getAuth(app);
|
|
368
|
-
* await signInWithCustomToken(auth, tokenData.accessToken);
|
|
369
|
-
*
|
|
370
|
-
* // Guard against token refresh failures
|
|
371
|
-
* if (tokenData.expiresIn < 300) { // Less than 5 minutes
|
|
372
|
-
* console.warn('Token expires soon, consider refreshing');
|
|
373
|
-
* }
|
|
374
|
-
* ```
|
|
214
|
+
* @returns Promise with token data and error
|
|
375
215
|
*/
|
|
376
216
|
async function getToken() {
|
|
377
217
|
const { data: verifiedToken, error: verifyError } = await getUser();
|
|
@@ -418,25 +258,14 @@ export function createFirebaseEdgeServer({ serviceAccount, firebaseConfig, provi
|
|
|
418
258
|
error: null,
|
|
419
259
|
};
|
|
420
260
|
}
|
|
421
|
-
/**
|
|
422
|
-
* Returns the complete Firebase Edge Server API with all authentication methods.
|
|
423
|
-
*
|
|
424
|
-
* @returns Object containing:
|
|
425
|
-
* - `auth`: Firebase Auth instance for client-side operations
|
|
426
|
-
* - `adminAuth`: Firebase Admin Auth instance for server-side operations
|
|
427
|
-
* - `signOut`: Function to sign out the current user
|
|
428
|
-
* - `getUser`: Function to get current user information with optional revocation checking
|
|
429
|
-
* - `getGoogleLoginURL`: Function to generate Google OAuth login URL
|
|
430
|
-
* - `signInWithGoogleWithCode`: Function to complete Google OAuth flow
|
|
431
|
-
* - `getToken`: Function to get fresh Firebase tokens for client-side usage
|
|
432
|
-
*/
|
|
433
261
|
return {
|
|
434
262
|
auth,
|
|
435
263
|
adminAuth,
|
|
436
264
|
signOut,
|
|
437
265
|
getUser,
|
|
438
266
|
getGoogleLoginURL,
|
|
439
|
-
|
|
267
|
+
getGitHubLoginURL,
|
|
268
|
+
signInWithCode,
|
|
440
269
|
getToken,
|
|
441
270
|
};
|
|
442
271
|
}
|
|
@@ -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,EACH,yBAAyB,EACzB,4BAA4B,GAC/B,MAAM,wBAAwB,CAAC;AAEhC,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
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.js","sourceRoot":"","sources":["../src/firebase-edge-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ vi.mock('./auth/firebase-admin-auth.js');
|
|
|
5
5
|
vi.mock('./auth/firebase-auth.js');
|
|
6
6
|
vi.mock('./auth/firebase-jwt.js');
|
|
7
7
|
vi.mock('./auth/google-oauth.js');
|
|
8
|
+
vi.mock('./auth/github-oauth.js');
|
|
8
9
|
const mockServiceAccount = {
|
|
9
10
|
type: 'service_account',
|
|
10
11
|
project_id: 'test-project',
|
|
@@ -30,26 +31,20 @@ const mockProviders = {
|
|
|
30
31
|
client_id: 'google-client-id',
|
|
31
32
|
client_secret: 'google-client-secret',
|
|
32
33
|
},
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
microsoft: { client_id: 'ms-id', client_secret: 'ms-secret' },
|
|
38
|
-
yahoo: { client_id: 'yahoo-id', client_secret: 'yahoo-secret' },
|
|
39
|
-
playgames: { client_id: 'pg-id', client_secret: 'pg-secret' },
|
|
34
|
+
github: {
|
|
35
|
+
client_id: 'github-client-id',
|
|
36
|
+
client_secret: 'github-client-secret',
|
|
37
|
+
},
|
|
40
38
|
};
|
|
41
39
|
describe('createFirebaseEdgeServer', () => {
|
|
42
40
|
let mockGetSession;
|
|
43
41
|
let mockSaveSession;
|
|
44
|
-
let
|
|
42
|
+
let server;
|
|
45
43
|
beforeEach(() => {
|
|
46
44
|
vi.clearAllMocks();
|
|
47
45
|
mockGetSession = vi.fn();
|
|
48
46
|
mockSaveSession = vi.fn();
|
|
49
|
-
|
|
50
|
-
});
|
|
51
|
-
it('should create server with all required methods', () => {
|
|
52
|
-
const server = createFirebaseEdgeServer({
|
|
47
|
+
server = createFirebaseEdgeServer({
|
|
53
48
|
serviceAccount: mockServiceAccount,
|
|
54
49
|
firebaseConfig: mockFirebaseConfig,
|
|
55
50
|
providers: mockProviders,
|
|
@@ -58,57 +53,39 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
58
53
|
saveSession: mockSaveSession,
|
|
59
54
|
},
|
|
60
55
|
});
|
|
61
|
-
expect(server).toHaveProperty('auth');
|
|
62
|
-
expect(server).toHaveProperty('adminAuth');
|
|
63
|
-
expect(server).toHaveProperty('signOut');
|
|
64
|
-
expect(server).toHaveProperty('getUser');
|
|
65
|
-
expect(server).toHaveProperty('getGoogleLoginURL');
|
|
66
|
-
expect(server).toHaveProperty('signInWithGoogleWithCode');
|
|
67
|
-
expect(server).toHaveProperty('getToken');
|
|
68
56
|
});
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
57
|
+
describe('factory function', () => {
|
|
58
|
+
it('creates server with all required methods', () => {
|
|
59
|
+
expect(server).toHaveProperty('auth');
|
|
60
|
+
expect(server).toHaveProperty('adminAuth');
|
|
61
|
+
expect(server).toHaveProperty('signOut');
|
|
62
|
+
expect(server).toHaveProperty('getUser');
|
|
63
|
+
expect(server).toHaveProperty('getGoogleLoginURL');
|
|
64
|
+
expect(server).toHaveProperty('getGitHubLoginURL');
|
|
65
|
+
expect(server).toHaveProperty('signInWithCode');
|
|
66
|
+
expect(server).toHaveProperty('getToken');
|
|
79
67
|
});
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
68
|
+
it('uses custom session name when provided', () => {
|
|
69
|
+
const customServer = createFirebaseEdgeServer({
|
|
70
|
+
serviceAccount: mockServiceAccount,
|
|
71
|
+
firebaseConfig: mockFirebaseConfig,
|
|
72
|
+
providers: mockProviders,
|
|
73
|
+
cookies: {
|
|
74
|
+
getSession: mockGetSession,
|
|
75
|
+
saveSession: mockSaveSession,
|
|
76
|
+
sessionName: 'custom-session',
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
customServer.signOut();
|
|
80
|
+
expect(mockSaveSession).toHaveBeenCalledWith('custom-session', '', expect.objectContaining({ maxAge: 0 }));
|
|
92
81
|
});
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
it('should accept custom fetch function', () => {
|
|
97
|
-
createFirebaseEdgeServer({
|
|
98
|
-
serviceAccount: mockServiceAccount,
|
|
99
|
-
firebaseConfig: mockFirebaseConfig,
|
|
100
|
-
providers: mockProviders,
|
|
101
|
-
cookies: {
|
|
102
|
-
getSession: mockGetSession,
|
|
103
|
-
saveSession: mockSaveSession,
|
|
104
|
-
},
|
|
105
|
-
fetch: mockFetch,
|
|
82
|
+
it('uses default session name "__session"', () => {
|
|
83
|
+
server.signOut();
|
|
84
|
+
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', expect.objectContaining({ maxAge: 0 }));
|
|
106
85
|
});
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
it('should clear session cookie with proper options', () => {
|
|
111
|
-
const server = createFirebaseEdgeServer({
|
|
86
|
+
it('accepts custom fetch function', () => {
|
|
87
|
+
const mockFetch = vi.fn();
|
|
88
|
+
const customServer = createFirebaseEdgeServer({
|
|
112
89
|
serviceAccount: mockServiceAccount,
|
|
113
90
|
firebaseConfig: mockFirebaseConfig,
|
|
114
91
|
providers: mockProviders,
|
|
@@ -116,7 +93,13 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
116
93
|
getSession: mockGetSession,
|
|
117
94
|
saveSession: mockSaveSession,
|
|
118
95
|
},
|
|
96
|
+
fetch: mockFetch,
|
|
119
97
|
});
|
|
98
|
+
expect(customServer).toBeDefined();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('signOut', () => {
|
|
102
|
+
it('clears session cookie with proper options', () => {
|
|
120
103
|
server.signOut();
|
|
121
104
|
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', {
|
|
122
105
|
httpOnly: true,
|
|
@@ -128,18 +111,74 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
128
111
|
});
|
|
129
112
|
});
|
|
130
113
|
describe('getUser', () => {
|
|
131
|
-
it('
|
|
114
|
+
it('returns null data when no session exists', async () => {
|
|
132
115
|
mockGetSession.mockResolvedValue(null);
|
|
133
|
-
const
|
|
116
|
+
const result = await server.getUser();
|
|
117
|
+
expect(result).toEqual({
|
|
118
|
+
data: null,
|
|
119
|
+
error: null,
|
|
120
|
+
});
|
|
121
|
+
expect(mockGetSession).toHaveBeenCalledWith('__session');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('getGoogleLoginURL', () => {
|
|
125
|
+
it('throws error when Google provider not configured', async () => {
|
|
126
|
+
const serverWithoutGoogle = createFirebaseEdgeServer({
|
|
134
127
|
serviceAccount: mockServiceAccount,
|
|
135
128
|
firebaseConfig: mockFirebaseConfig,
|
|
136
|
-
providers:
|
|
129
|
+
providers: {},
|
|
137
130
|
cookies: {
|
|
138
131
|
getSession: mockGetSession,
|
|
139
132
|
saveSession: mockSaveSession,
|
|
140
133
|
},
|
|
141
134
|
});
|
|
142
|
-
|
|
135
|
+
await expect(serverWithoutGoogle.getGoogleLoginURL('http://localhost', '/dashboard')).rejects.toThrow('Google provider not configured');
|
|
136
|
+
});
|
|
137
|
+
it('calls deleteSession before generating URL', async () => {
|
|
138
|
+
const { createGoogleOAuthLoginUrl } = await import('./auth/google-oauth.js');
|
|
139
|
+
vi.mocked(createGoogleOAuthLoginUrl).mockReturnValue('http://oauth-url');
|
|
140
|
+
await server.getGoogleLoginURL('http://localhost', '/dashboard');
|
|
141
|
+
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', expect.objectContaining({ maxAge: 0 }));
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('getGitHubLoginURL', () => {
|
|
145
|
+
it('throws error when GitHub provider not configured', async () => {
|
|
146
|
+
const serverWithoutGitHub = createFirebaseEdgeServer({
|
|
147
|
+
serviceAccount: mockServiceAccount,
|
|
148
|
+
firebaseConfig: mockFirebaseConfig,
|
|
149
|
+
providers: {},
|
|
150
|
+
cookies: {
|
|
151
|
+
getSession: mockGetSession,
|
|
152
|
+
saveSession: mockSaveSession,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
await expect(serverWithoutGitHub.getGitHubLoginURL('http://localhost', '/dashboard')).rejects.toThrow('GitHub provider not configured');
|
|
156
|
+
});
|
|
157
|
+
it('calls deleteSession before generating URL', async () => {
|
|
158
|
+
const { createGitHubOAuthLoginUrl } = await import('./auth/github-oauth.js');
|
|
159
|
+
vi.mocked(createGitHubOAuthLoginUrl).mockReturnValue('http://github-oauth-url');
|
|
160
|
+
await server.getGitHubLoginURL('http://localhost', '/dashboard');
|
|
161
|
+
expect(mockSaveSession).toHaveBeenCalledWith('__session', '', expect.objectContaining({ maxAge: 0 }));
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('signInWithCode', () => {
|
|
165
|
+
it('returns error when no provider specified in state', async () => {
|
|
166
|
+
const result = await server.signInWithCode('auth-code', 'http://localhost', null);
|
|
167
|
+
expect(result).toEqual({
|
|
168
|
+
error: expect.any(Error),
|
|
169
|
+
});
|
|
170
|
+
expect(result.error).toBeInstanceOf(Error);
|
|
171
|
+
expect(result.error.message).toBe('No provider specified in state');
|
|
172
|
+
});
|
|
173
|
+
it('handles invalid JSON state gracefully', async () => {
|
|
174
|
+
// We expect this to throw during JSON.parse, which is the current behavior
|
|
175
|
+
await expect(server.signInWithCode('auth-code', 'http://localhost', 'invalid-json')).rejects.toThrow();
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('getToken', () => {
|
|
179
|
+
it('returns null when no verified token', async () => {
|
|
180
|
+
mockGetSession.mockResolvedValue(null);
|
|
181
|
+
const result = await server.getToken();
|
|
143
182
|
expect(result).toEqual({
|
|
144
183
|
data: null,
|
|
145
184
|
error: null,
|
|
@@ -147,7 +186,7 @@ describe('createFirebaseEdgeServer', () => {
|
|
|
147
186
|
});
|
|
148
187
|
});
|
|
149
188
|
describe('OFFICIAL_FIREBASE_OAUTH_PROVIDERS', () => {
|
|
150
|
-
it('
|
|
189
|
+
it('contains all supported OAuth providers', () => {
|
|
151
190
|
expect(OFFICIAL_FIREBASE_OAUTH_PROVIDERS).toEqual([
|
|
152
191
|
'google',
|
|
153
192
|
'facebook',
|
|
@@ -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,GACpC,MAAM,2BAA2B,CAAC;AAGnC,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,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,
|
|
1
|
+
{"version":3,"file":"firebase-edge-server.test.js","sourceRoot":"","sources":["../src/firebase-edge-server.test.ts"],"names":[],"mappings":"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"}
|