MotorSignal-App/server/waze_relay/middleware/firebase_auth.js

48 lines
1.4 KiB
JavaScript

const admin = require('firebase-admin');
const { getAuth } = require('firebase-admin/auth');
// Initialize Firebase Admin if not already initialized
try {
const apps = admin.getApps ? admin.getApps() : (admin.apps || []);
if (apps.length === 0) {
admin.initializeApp({
projectId: process.env.FIREBASE_PROJECT_ID || process.env.GCLOUD_PROJECT || 'motoapp-d22e0'
});
}
} 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 auth = typeof admin.auth === 'function' ? admin.auth() : getAuth();
const decodedToken = await 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 };