43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
const admin = require('firebase-admin');
|
|
|
|
// Initialize Firebase Admin if not already initialized
|
|
try {
|
|
if (admin.apps && admin.apps.length === 0) {
|
|
admin.initializeApp();
|
|
}
|
|
} catch (e) {
|
|
console.warn('Firebase admin initialization failed:', e.message);
|
|
}
|
|
|
|
/**
|
|
* Express middleware to verify Firebase ID tokens.
|
|
*/
|
|
async function requireAuth(req, res, next) {
|
|
const authHeader = req.headers.authorization;
|
|
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
return res.status(401).json({
|
|
error: 'authenticationRequired',
|
|
message: 'Missing or malformed Authorization header'
|
|
});
|
|
}
|
|
|
|
const idToken = authHeader.split('Bearer ')[1];
|
|
|
|
try {
|
|
const decodedToken = await admin.auth().verifyIdToken(idToken);
|
|
req.user = decodedToken;
|
|
next();
|
|
} catch (error) {
|
|
console.error('Error verifying Firebase ID token:', error.message);
|
|
let errorCode = 'invalidToken';
|
|
if (error.code === 'auth/id-token-expired') errorCode = 'expiredToken';
|
|
|
|
return res.status(401).json({
|
|
error: errorCode,
|
|
message: 'Invalid or expired Firebase ID token'
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = { requireAuth, admin };
|