import express from 'express';
import session from 'express-session';
import RedisStore from 'connect-redis';
import { createClient } from 'redis';
const app = express();
// Redis client for session storage
const redisClient = createClient();
await redisClient.connect();
// Session middleware
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // HTTPS only
httpOnly: true, // Prevent JS access
sameSite: 'lax', // CSRF protection
maxAge: 24 * 60 * 60 * 1000 // 24 hours
}
}));
// Proxy requests to FLTR API
app.get('/api/datasets', async (req, res) => {
if (!req.session.fltrAccessToken) {
return res.status(401).json({ error: 'Not authenticated' });
}
const response = await fetch('https://api.fltr.com/v1/datasets', {
headers: {
'Authorization': `Bearer ${req.session.fltrAccessToken}`
}
});
const data = await response.json();
res.json(data);
});
// Login callback
app.get('/auth/callback', async (req, res) => {
const { code } = req.query;
// Exchange code for access token (OAuth flow)
const tokenResponse = await fetch('https://www.tryfltr.com/oauth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
code,
client_id: process.env.FLTR_CLIENT_ID,
client_secret: process.env.FLTR_CLIENT_SECRET,
redirect_uri: 'http://localhost:3000/auth/callback'
})
});
const tokens = await tokenResponse.json();
// Store in session
req.session.fltrAccessToken = tokens.access_token;
req.session.fltrRefreshToken = tokens.refresh_token;
res.redirect('/');
});
// Logout
app.post('/auth/logout', (req, res) => {
req.session.destroy();
res.json({ success: true });
});
app.listen(3000);