Spaces:
Running
Running
File size: 2,497 Bytes
590d81d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
```javascript
const { OAuth2Client } = require('google-auth-library');
const express = require('express');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config();
const app = express();
const client = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
// Middleware
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: { secure: process.env.NODE_ENV === 'production', maxAge: 24 * 60 * 60 * 1000 }
}));
// Google OAuth routes
app.get('/auth/google', (req, res) => {
const url = client.generateAuthUrl({
access_type: 'online',
scope: ['profile', 'email'],
redirect_uri: process.env.GOOGLE_REDIRECT_URI
});
res.redirect(url);
});
app.get('/auth/google/callback', async (req, res) => {
const { code } = req.query;
try {
const { tokens } = await client.getToken({
code,
redirect_uri: process.env.GOOGLE_REDIRECT_URI
});
const ticket = await client.verifyIdToken({
idToken: tokens.id_token,
audience: process.env.GOOGLE_CLIENT_ID
});
const payload = ticket.getPayload();
req.session.user = {
id: payload.sub,
email: payload.email,
name: payload.name,
picture: payload.picture
};
res.redirect('/');
} catch (error) {
console.error('Auth error:', error);
res.redirect('/?auth_error=1');
}
});
app.get('/auth/logout', (req, res) => {
req.session.destroy();
res.redirect('/');
});
app.get('/auth/status', (req, res) => {
res.json({ isAuthenticated: !!req.session.user, user: req.session.user });
});
// Chat history routes
app.get('/api/chats', async (req, res) => {
if (!req.session.user) return res.sendStatus(401);
// In a real app, you'd fetch from a database
const chats = JSON.parse(localStorage.getItem(`chats_${req.session.user.id}`) || '[]');
res.json(chats);
});
app.post('/api/chats', async (req, res) => {
if (!req.session.user) return res.sendStatus(401);
// In a real app, you'd save to a database
const chats = JSON.parse(localStorage.getItem(`chats_${req.session.user.id}`) || '[]');
chats.push(req.body);
localStorage.setItem(`chats_${req.session.user.id}`, JSON.stringify(chats));
res.sendStatus(201);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
``` |