@libreapps/auth-firebase 1.1.1

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.
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Firebase Client-side Authentication Support
3
+ * This module provides Firebase authentication methods for the client-side.
4
+ */
5
+ import { FacebookAuthProvider, GoogleAuthProvider, GithubAuthProvider, signInWithPopup, createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithCustomToken, } from 'firebase/auth';
6
+ import { initializeApp, getApps, FirebaseError } from "firebase/app";
7
+ import { getAuth } from "firebase/auth";
8
+ import { getFirestore } from 'firebase/firestore';
9
+ export const firebaseConfig = {
10
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
11
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
12
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
13
+ storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
14
+ messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
15
+ appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
16
+ };
17
+ // Check if Firebase is configured
18
+ export const isFirebaseConfigured = () => {
19
+ return !!(firebaseConfig.apiKey && firebaseConfig.projectId);
20
+ };
21
+ // Initialize Firebase only if configured
22
+ let firebaseApp = null;
23
+ let auth = null;
24
+ let db = null;
25
+ if (typeof window !== 'undefined' && isFirebaseConfigured()) {
26
+ firebaseApp = getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0];
27
+ auth = getAuth(firebaseApp);
28
+ db = getFirestore(firebaseApp, 'accounts');
29
+ }
30
+ export { auth, db };
31
+ export async function loginWithProvider(provider) {
32
+ if (!auth) {
33
+ console.warn('Firebase auth not configured');
34
+ return { success: false, user: null };
35
+ }
36
+ const authProvider = (() => {
37
+ switch (provider) {
38
+ case 'google':
39
+ return new GoogleAuthProvider();
40
+ case 'facebook':
41
+ return new FacebookAuthProvider();
42
+ case 'github':
43
+ return new GithubAuthProvider();
44
+ default:
45
+ return null;
46
+ }
47
+ })();
48
+ if (!authProvider) {
49
+ return { success: false, user: null };
50
+ }
51
+ try {
52
+ const userCreds = await signInWithPopup(auth, authProvider);
53
+ const idToken = await userCreds.user.getIdToken();
54
+ const response = await fetch('/api/auth/login', {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify({ idToken }),
58
+ });
59
+ const resBody = (await response.json());
60
+ if (response.ok && resBody.success) {
61
+ return { success: true, user: userCreds.user };
62
+ }
63
+ else {
64
+ return { success: false, user: null };
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.error('Error signing in with provider', error);
69
+ return { success: false, user: null };
70
+ }
71
+ }
72
+ export async function signupWithEmailAndPassword(email, password) {
73
+ if (!auth) {
74
+ return { success: false, message: 'Firebase auth not configured' };
75
+ }
76
+ let user = undefined;
77
+ try {
78
+ const userCredential = await createUserWithEmailAndPassword(auth, email, password);
79
+ user = userCredential.user;
80
+ }
81
+ catch (error) {
82
+ if (error instanceof FirebaseError) {
83
+ console.error(error.code);
84
+ return { success: false, message: error.code };
85
+ }
86
+ return { success: false, message: error };
87
+ }
88
+ try {
89
+ const idToken = await user.getIdToken();
90
+ const response = await fetch('/api/auth/login', {
91
+ method: 'POST',
92
+ headers: { 'Content-Type': 'application/json' },
93
+ body: JSON.stringify({ idToken }),
94
+ });
95
+ const resBody = (await response.json());
96
+ if (response.ok && resBody.success) {
97
+ return { success: true, user };
98
+ }
99
+ else {
100
+ return { success: false };
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error('Error signing in with Firebase auth', error);
105
+ return { success: false };
106
+ }
107
+ }
108
+ export async function loginWithEmailAndPassword(email, password) {
109
+ if (!auth) {
110
+ return { success: false, message: 'Firebase auth not configured' };
111
+ }
112
+ let user = undefined;
113
+ try {
114
+ const userCredential = await signInWithEmailAndPassword(auth, email, password);
115
+ user = userCredential.user;
116
+ }
117
+ catch (error) {
118
+ if (error instanceof FirebaseError) {
119
+ console.error(error.code);
120
+ return { success: false, message: error.code };
121
+ }
122
+ return { success: false, message: error };
123
+ }
124
+ try {
125
+ const idToken = await user.getIdToken();
126
+ const response = await fetch('/api/auth/login', {
127
+ method: 'POST',
128
+ headers: { 'Content-Type': 'application/json' },
129
+ body: JSON.stringify({ idToken }),
130
+ });
131
+ const resBody = (await response.json());
132
+ if (response.ok && resBody.success) {
133
+ return { success: true, user, message: "Login Successfully!" };
134
+ }
135
+ else {
136
+ return { success: false, message: "Login API Failed" };
137
+ }
138
+ }
139
+ catch (error) {
140
+ console.error('Error signing in with Firebase auth', error);
141
+ return { success: false, message: "Error signing in with Firebase auth" };
142
+ }
143
+ }
144
+ export async function loginWithCustomToken(token) {
145
+ if (!auth) {
146
+ return { success: false };
147
+ }
148
+ let user = undefined;
149
+ const userCredential = await signInWithCustomToken(auth, token);
150
+ user = userCredential.user;
151
+ try {
152
+ const idToken = await user.getIdToken();
153
+ const response = await fetch('/api/auth/login', {
154
+ method: 'POST',
155
+ headers: { 'Content-Type': 'application/json' },
156
+ body: JSON.stringify({ idToken }),
157
+ });
158
+ const resBody = (await response.json());
159
+ if (response.ok && resBody.success) {
160
+ return { success: true, user };
161
+ }
162
+ else {
163
+ return { success: false };
164
+ }
165
+ }
166
+ catch (error) {
167
+ console.error('Error signing in with Firebase auth', error);
168
+ return { success: false };
169
+ }
170
+ }
171
+ export async function logoutBackend() {
172
+ try {
173
+ const response = await fetch('/api/auth/logout', { headers: { 'Content-Type': 'application/json' } });
174
+ const resBody = (await response.json());
175
+ if (response.ok && resBody.success) {
176
+ return { success: true };
177
+ }
178
+ else {
179
+ return { success: false };
180
+ }
181
+ }
182
+ catch (error) {
183
+ console.error('Error logging out on server', error);
184
+ return { success: false };
185
+ }
186
+ }
187
+ //# sourceMappingURL=firebase-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-support.js","sourceRoot":"","sources":["../../service/firebase-support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Firebase Auth Service exports
3
+ */
4
+ export { default as FirebaseAuthService } from './firebase-auth-service';
5
+ export { auth, db, isFirebaseConfigured, firebaseConfig, loginWithProvider, signupWithEmailAndPassword, loginWithEmailAndPassword, loginWithCustomToken, logoutBackend } from './firebase-support';
6
+ export { associateWalletAddressWithAccount, getAssociatedWalletAddress } from './wallet-support';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Firebase Auth Service exports
3
+ */
4
+ export { default as FirebaseAuthService } from './firebase-auth-service';
5
+ export { auth, db, isFirebaseConfigured, firebaseConfig, loginWithProvider, signupWithEmailAndPassword, loginWithEmailAndPassword, loginWithCustomToken, logoutBackend } from './firebase-support';
6
+ export { associateWalletAddressWithAccount, getAssociatedWalletAddress } from './wallet-support';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../service/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EACL,IAAI,EACJ,EAAE,EACF,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,EACd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,iCAAiC,EACjC,0BAA0B,EAC3B,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Wallet Support - Firebase Firestore integration for wallet addresses
3
+ */
4
+ export declare function associateWalletAddressWithAccount(userEmail: string, siteName?: string): Promise<{
5
+ result: string | null;
6
+ error: unknown;
7
+ }>;
8
+ export declare function getAssociatedWalletAddress(userEmail: string): Promise<{
9
+ error: any;
10
+ result?: string;
11
+ }>;
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Wallet Support - Firebase Firestore integration for wallet addresses
3
+ */
4
+ import { collection, doc, getDoc, setDoc } from 'firebase/firestore';
5
+ import { auth, db } from './firebase-support';
6
+ const isObject = (obj) => typeof obj === 'object' && obj !== null;
7
+ const isGlobalThisEthereum = (obj) => isObject(obj) && isObject(obj.ethereum) && typeof obj.ethereum.request === 'function';
8
+ const getEthereum = (obj) => isGlobalThisEthereum(obj) ? obj.ethereum : null;
9
+ const ethereum = getEthereum(globalThis);
10
+ let signMessage = (opts) => `${opts.siteName} wants you to sign in with your Ethereum account:\n${opts.address}`;
11
+ const USER_INFO_COLLECTION = 'HZ_USER_INFO';
12
+ async function connectWalletAddress(siteName) {
13
+ if (!ethereum) {
14
+ throw new Error('No ethereum provider found');
15
+ }
16
+ if (!auth) {
17
+ throw new Error('Firebase auth not configured');
18
+ }
19
+ const [account] = await ethereum.request({ method: 'eth_requestAccounts' });
20
+ if (!account) {
21
+ throw new Error('No account found');
22
+ }
23
+ const signed = await ethereum.request({
24
+ method: 'personal_sign',
25
+ params: [
26
+ signMessage({
27
+ siteName: siteName ?? auth.app.options.projectId ?? globalThis.location.hostname,
28
+ address: account,
29
+ }),
30
+ account,
31
+ auth.app.options.appId,
32
+ ],
33
+ });
34
+ if (!signed) {
35
+ throw new Error('Not signed');
36
+ }
37
+ return { account, signed };
38
+ }
39
+ export async function associateWalletAddressWithAccount(userEmail, siteName) {
40
+ const { account } = await connectWalletAddress(siteName);
41
+ if (!db) {
42
+ return { result: null, error: new Error('Firebase Firestore not configured') };
43
+ }
44
+ let result = null;
45
+ let error = null;
46
+ const accountsRef = collection(db, USER_INFO_COLLECTION);
47
+ try {
48
+ try {
49
+ await setDoc(doc(accountsRef, userEmail), { walletAddress: account });
50
+ result = account;
51
+ }
52
+ catch (e) {
53
+ console.error(e);
54
+ error = e;
55
+ }
56
+ }
57
+ catch (e) {
58
+ console.error(e);
59
+ error = e;
60
+ }
61
+ return { result, error };
62
+ }
63
+ export async function getAssociatedWalletAddress(userEmail) {
64
+ if (!db) {
65
+ return { error: new Error('Firebase Firestore not configured'), result: undefined };
66
+ }
67
+ let result = undefined;
68
+ let error = null;
69
+ try {
70
+ try {
71
+ const docRef = await getDoc(doc(db, USER_INFO_COLLECTION, userEmail));
72
+ result = docRef.data() ? docRef.data().walletAddress : undefined;
73
+ }
74
+ catch (e) {
75
+ console.error(e);
76
+ error = e;
77
+ }
78
+ }
79
+ catch (e) {
80
+ console.error(e);
81
+ error = e;
82
+ }
83
+ return { result, error };
84
+ }
85
+ //# sourceMappingURL=wallet-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-support.js","sourceRoot":"","sources":["../../service/wallet-support.ts"],"names":[],"mappings":"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"}
package/index.ts ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @libreapps/auth-firebase
3
+ *
4
+ * Firebase authentication provider for @libreapps/auth
5
+ *
6
+ * This package is OPTIONAL - only install if you need Firebase authentication.
7
+ * The core @libreapps/auth package works without Firebase.
8
+ *
9
+ * Usage:
10
+ * ```ts
11
+ * import { FirebaseAuthService } from '@libreapps/auth-firebase'
12
+ * import { registerAuthProvider } from '@libreapps/auth'
13
+ *
14
+ * // Register Firebase as the auth provider
15
+ * if (FirebaseAuthService.isConfigured()) {
16
+ * registerAuthProvider('firebase', FirebaseAuthService)
17
+ * }
18
+ * ```
19
+ */
20
+
21
+ // Client-side exports
22
+ export { FirebaseAuthService, isFirebaseConfigured } from './service'
23
+
24
+ // Re-export types from @libreapps/auth for convenience
25
+ export type {
26
+ AuthService,
27
+ AuthServiceConf,
28
+ LibreAppsUserInfo,
29
+ LibreAppsUserInfoValue
30
+ } from '@libreapps/auth'
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@libreapps/auth-firebase",
3
+ "version": "1.1.1",
4
+ "description": "Firebase authentication provider for @libreapps/auth",
5
+ "publishConfig": {
6
+ "registry": "https://registry.npmjs.org/",
7
+ "access": "public",
8
+ "scope": "@libreapps"
9
+ },
10
+ "author": "LibreApps Contributors",
11
+ "license": "BSD-3-Clause",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/libre-apps/UI.git",
15
+ "directory": "pkg/auth-firebase"
16
+ },
17
+ "keywords": [
18
+ "auth",
19
+ "firebase",
20
+ "libreapps",
21
+ "libreapps"
22
+ ],
23
+ "main": "index.ts",
24
+ "exports": {
25
+ ".": "./index.ts",
26
+ "./server": "./server/index.ts",
27
+ "./service": "./service/index.ts"
28
+ },
29
+ "dependencies": {
30
+ "firebase-admin": "^12.1.0"
31
+ },
32
+ "peerDependencies": {
33
+ "firebase": "^10.8.0",
34
+ "mobx": "^6.12.3",
35
+ "mobx-react-lite": "^4.0.7",
36
+ "next": ">=14.2.16"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^24.4.0",
40
+ "@types/react": "^19.0.0",
41
+ "typescript": "5.6.3",
42
+ "@libreapps/auth": "3.0.1",
43
+ "@libreapps/ui": "5.4.1"
44
+ },
45
+ "scripts": {
46
+ "lat": "npm show @libreapps/auth-firebase version",
47
+ "pub": "npm publish",
48
+ "tc": "tsc",
49
+ "build": "tsc --outDir dist --declaration --emitDeclarationOnly false --module ESNext --esModuleInterop true --skipLibCheck true --sourceMap true"
50
+ }
51
+ }
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Server-side Firebase authentication
3
+ * For static builds, these functions return null/false gracefully.
4
+ */
5
+
6
+ import type { LibreAppsUserInfoValue } from '@libreapps/auth'
7
+
8
+ /**
9
+ * Check if Firebase Admin is properly configured
10
+ */
11
+ export function isFirebaseAdminConfigured(): boolean {
12
+ return !!(
13
+ process.env.FIREBASE_CLIENT_EMAIL &&
14
+ process.env.FIREBASE_PROJECT_ID &&
15
+ process.env.FIREBASE_PRIVATE_KEY
16
+ )
17
+ }
18
+
19
+ /**
20
+ * Get the current user from server-side session cookie
21
+ */
22
+ export async function getUserServerSide(): Promise<LibreAppsUserInfoValue | null> {
23
+ // Check if we're in a server environment
24
+ if (typeof window !== 'undefined') {
25
+ return null
26
+ }
27
+
28
+ try {
29
+ // Dynamic imports to prevent bundling issues in static export
30
+ const { cookies } = await import('next/headers')
31
+ const { initializeApp, getApps, cert } = await import('firebase-admin/app')
32
+ type App = Awaited<ReturnType<typeof initializeApp>>
33
+ const { getAuth } = await import('firebase-admin/auth')
34
+ const { getFirestore } = await import('firebase-admin/firestore')
35
+
36
+ if (!isFirebaseAdminConfigured()) {
37
+ console.warn('Firebase credentials not configured')
38
+ return null
39
+ }
40
+
41
+ const firebaseApp = getApps().find((it) => it.name === 'firebase-admin-app') ||
42
+ initializeApp({
43
+ credential: cert({
44
+ clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
45
+ projectId: process.env.FIREBASE_PROJECT_ID,
46
+ privateKey: process.env.FIREBASE_PRIVATE_KEY!.replace(/\\n/g, '\n')
47
+ }),
48
+ }, 'firebase-admin-app')
49
+
50
+ const auth = getAuth(firebaseApp)
51
+ const db = getFirestore(firebaseApp as App, 'accounts')
52
+
53
+ const c = await cookies()
54
+ const session = c.get('__session')?.value
55
+
56
+ if (!session) return null
57
+
58
+ try {
59
+ const isRevoked = !(await auth.verifySessionCookie(session, true))
60
+ if (isRevoked) return null
61
+ } catch {
62
+ return null
63
+ }
64
+
65
+ const decodedIdToken = await auth.verifySessionCookie(session)
66
+ const currentUser = await auth.getUser(decodedIdToken.uid)
67
+ const walletAddress = await db.collection('USER_INFO').doc(currentUser.email ?? '').get()
68
+
69
+ return {
70
+ email: currentUser.email ?? '',
71
+ displayName: currentUser.displayName ?? null,
72
+ walletAddress: walletAddress.get('walletAddress') ?? null,
73
+ }
74
+ } catch (error) {
75
+ console.warn('Server-side auth not available:', error)
76
+ return null
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Generate a custom token for the current session
82
+ */
83
+ export async function generateCustomToken(): Promise<{success: boolean, token: string | null}> {
84
+ if (typeof window !== 'undefined') {
85
+ return { success: false, token: null }
86
+ }
87
+
88
+ try {
89
+ const { cookies } = await import('next/headers')
90
+ const { initializeApp, getApps, cert } = await import('firebase-admin/app')
91
+ const { getAuth } = await import('firebase-admin/auth')
92
+
93
+ if (!isFirebaseAdminConfigured()) {
94
+ return { success: false, token: null }
95
+ }
96
+
97
+ const firebaseApp = getApps().find((it) => it.name === 'firebase-admin-app') ||
98
+ initializeApp({
99
+ credential: cert({
100
+ clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
101
+ projectId: process.env.FIREBASE_PROJECT_ID,
102
+ privateKey: process.env.FIREBASE_PRIVATE_KEY!.replace(/\\n/g, '\n')
103
+ }),
104
+ }, 'firebase-admin-app')
105
+
106
+ const auth = getAuth(firebaseApp)
107
+ const c = await cookies()
108
+ const session = c.get('__session')?.value
109
+
110
+ if (!session) return { success: false, token: null }
111
+
112
+ const decodedIdToken = await auth.verifySessionCookie(session)
113
+ const currentUser = await auth.getUser(decodedIdToken.uid)
114
+ const token = await auth.createCustomToken(currentUser.uid)
115
+
116
+ return { success: true, token }
117
+ } catch (error) {
118
+ console.warn('Token generation not available:', error)
119
+ return { success: false, token: null }
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Create a session cookie from an ID token
125
+ */
126
+ export async function createSessionCookie(idToken: string, sessionCookieOptions: any) {
127
+ try {
128
+ const { initializeApp, getApps, cert } = await import('firebase-admin/app')
129
+ const { getAuth } = await import('firebase-admin/auth')
130
+
131
+ if (!isFirebaseAdminConfigured()) {
132
+ throw new Error('Firebase not configured')
133
+ }
134
+
135
+ const firebaseApp = getApps().find((it) => it.name === 'firebase-admin-app') ||
136
+ initializeApp({
137
+ credential: cert({
138
+ clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
139
+ projectId: process.env.FIREBASE_PROJECT_ID,
140
+ privateKey: process.env.FIREBASE_PRIVATE_KEY!.replace(/\\n/g, '\n')
141
+ }),
142
+ }, 'firebase-admin-app')
143
+
144
+ const auth = getAuth(firebaseApp)
145
+ return auth.createSessionCookie(idToken, sessionCookieOptions)
146
+ } catch (error) {
147
+ console.warn('Session cookie creation not available:', error)
148
+ throw error
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Revoke all sessions for the current user
154
+ */
155
+ export async function revokeAllSessions(session: string) {
156
+ try {
157
+ const { initializeApp, getApps, cert } = await import('firebase-admin/app')
158
+ const { getAuth } = await import('firebase-admin/auth')
159
+
160
+ if (!isFirebaseAdminConfigured()) {
161
+ throw new Error('Firebase not configured')
162
+ }
163
+
164
+ const firebaseApp = getApps().find((it) => it.name === 'firebase-admin-app') ||
165
+ initializeApp({
166
+ credential: cert({
167
+ clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
168
+ projectId: process.env.FIREBASE_PROJECT_ID,
169
+ privateKey: process.env.FIREBASE_PRIVATE_KEY!.replace(/\\n/g, '\n')
170
+ }),
171
+ }, 'firebase-admin-app')
172
+
173
+ const auth = getAuth(firebaseApp)
174
+ const decodedIdToken = await auth.verifySessionCookie(session)
175
+ return await auth.revokeRefreshTokens(decodedIdToken.sub)
176
+ } catch (error) {
177
+ console.warn('Session revocation not available:', error)
178
+ throw error
179
+ }
180
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Firebase Admin Server exports
3
+ */
4
+
5
+ export {
6
+ getUserServerSide,
7
+ generateCustomToken,
8
+ createSessionCookie,
9
+ revokeAllSessions,
10
+ isFirebaseAdminConfigured
11
+ } from './firebase-support'