-
Notifications
You must be signed in to change notification settings - Fork 66
Expand file tree
/
Copy pathserver.js
More file actions
130 lines (110 loc) · 2.94 KB
/
Copy pathserver.js
File metadata and controls
130 lines (110 loc) · 2.94 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const fs = require('fs');
const path = require('path');
const https = require('https');
const express = require('express');
const helmet = require('helmet');
const passport = require('passport');
const { Strategy } = require('passport-google-oauth20');
const cookieSession = require('cookie-session');
const { verify } = require('crypto');
require('dotenv').config();
const PORT = 3000;
const config = {
CLIENT_ID: process.env.CLIENT_ID,
CLIENT_SECRET: process.env.CLIENT_SECRET,
COOKIE_KEY_1: process.env.COOKIE_KEY_1,
COOKIE_KEY_2: process.env.COOKIE_KEY_2,
};
const AUTH_OPTIONS = {
callbackURL: '/auth/google/callback',
clientID: config.CLIENT_ID,
clientSecret: config.CLIENT_SECRET,
};
function verifyCallback(accessToken, refreshToken, profile, done) {
console.log('Google profile', profile);
done(null, profile);
}
passport.use(new Strategy(AUTH_OPTIONS, verifyCallback));
// Save the session to the cookie
passport.serializeUser((user, done) => {
done(null, user.id);
});
// Read the session from the cookie
passport.deserializeUser((id, done) => {
// User.findById(id).then(user => {
// done(null, user);
// });
done(null, id);
});
const app = express();
app.use(helmet());
app.use(cookieSession({
name: 'session',
maxAge: 24 * 60 * 60 * 1000,
keys: [config.COOKIE_KEY_1, config.COOKIE_KEY_2],
}));
app.use((req, res, next) => {
// Stub out missing regenerate and save functions.
// These don't make sense for client side sessions.
if (req.session && !req.session.regenerate) {
req.session.regenerate = (cb) => {
cb();
};
}
if (req.session && !req.session.save) {
req.session.save = (cb) => {
cb();
};
}
next();
});
app.use(passport.initialize());
app.use(passport.session());
function checkLoggedIn(req, res, next) {
console.log('Current user is:', req.user);
const isLoggedIn = req.isAuthenticated() && req.user;
if (!isLoggedIn) {
return res.status(401).json({
error: 'You must log in!',
});
}
next();
}
app.get('/auth/google',
passport.authenticate('google', {
scope: ['email'],
}));
app.get('/auth/google/callback',
passport.authenticate('google', {
failureRedirect: '/failure',
successRedirect: '/',
session: true,
}),
(req, res) => {
console.log('Google called us back!');
}
);
app.get('/auth/logout', (req, res, next) => {
//Removes req.user and clears any logged in session
req.logout((err) => {
if (err) {
return next(err);
}
res.redirect('/');
});
});
app.get('/secret', checkLoggedIn, (req, res) => {
return res.send('Your personal secret value is 42!');
});
app.get('/failure', (req, res) => {
return res.send('Failed to log in!');
});
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
https.createServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem'),
}, app).listen(PORT, () => {
console.log(`Listening on port ${PORT}...`);
});