@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.
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +13 -0
- package/LICENSE.md +21 -0
- package/README.md +87 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/server/firebase-support.d.ts +28 -0
- package/dist/server/firebase-support.js +157 -0
- package/dist/server/firebase-support.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -0
- package/dist/service/firebase-auth-service.d.ts +36 -0
- package/dist/service/firebase-auth-service.js +182 -0
- package/dist/service/firebase-auth-service.js.map +1 -0
- package/dist/service/firebase-support.d.ts +39 -0
- package/dist/service/firebase-support.js +187 -0
- package/dist/service/firebase-support.js.map +1 -0
- package/dist/service/index.d.ts +6 -0
- package/dist/service/index.js +7 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/wallet-support.d.ts +11 -0
- package/dist/service/wallet-support.js +85 -0
- package/dist/service/wallet-support.js.map +1 -0
- package/index.ts +30 -0
- package/package.json +51 -0
- package/server/firebase-support.ts +180 -0
- package/server/index.ts +11 -0
- package/service/firebase-auth-service.ts +233 -0
- package/service/firebase-support.ts +234 -0
- package/service/index.ts +20 -0
- package/service/wallet-support.ts +103 -0
- package/tsconfig.json +15 -0
|
@@ -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
|
+
}
|