authservestatic
Version:
Serve static files with google authentication
87 lines (75 loc) • 2.67 kB
JavaScript
const fs = require('fs')
const express = require('express')
const cookieParser = require('cookie-parser')
const cookieSession = require('cookie-session')
const app = express()
const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth20').Strategy
const config = JSON.parse(fs.readFileSync('staticauth.json', 'utf8'))
console.log(config) //eslint-disable-line
let port = 8080
let callbackURL = 'http://localhost:8080/auth/google/callback'
if (process.env.NODE_ENV == 'production') {
port = config.port
callbackURL = `${config.domain}${config.callbackEndpoint}`
}
console.log('callbackURL: ', callbackURL) //eslint-disable-line
const googleAuth = { ...config.googleAuth, callbackURL }
// Passport utils
passport.serializeUser((user, done) => {
done(null, user)
})
passport.deserializeUser((user, done) => {
done(null, user)
})
// Set up passport
app.use(cookieParser())
app.set('trust proxy', 1) // trust first proxy
app.use(cookieSession(config.cookie))
app.use(passport.initialize())
app.use(passport.session())
passport.use(
new GoogleStrategy(googleAuth, (token, tokenSecret, profile, done) => {
const domain = profile._json.email.split('@')[1]
if (config.validDomains.indexOf(domain) === -1)
done(null, false, { message: config.failureMessage })
return done(null, { user: profile._json })
})
)
const isAuthenticated = (req, res, next) => {
if (req.isAuthenticated()) {
next()
} else {
console.log('req:', req) // FIXME: figure out how to get the full url. currently the part after # is stripped
req.session.returnTo = req.originalUrl
res.redirect('/')
}
}
// Endpoints
app.get('/ping', (req, res) => res.send('pong'))
app.use(config.successRedirect, isAuthenticated, express.static(config.contentFolder))
app.get(
'/login',
passport.authenticate('google', {
hd: 'saama.com',
scope: config.scope,
successRedirect: config.successRedirect,
failureRedirect: '/authfailed',
prompt: 'select_account', // Do not login automatically if one account
})
)
app.get('/authfailed', (req, res) => {
res.send(`${config.failureMessage}<br><a href="/login">Relogin</a>`) // TODO: Load error page from config
})
app.get('/', passport.authenticate('google', { scope: ['profile', 'email'] }))
app.get(
config.callbackEndpoint,
passport.authenticate('google', { failureRedirect: '/authfailed', scope: config.scope }),
(req, res) => {
res.redirect(req.session.returnTo || config.successRedirect)
delete req.session.returnTo
}
)
// Start app
app.listen(port, () => console.log(`Server started on ${port}`)) // eslint-disable-line