app.js
unknown
javascript
4 years ago
5.0 kB
10
Indexable
require('dotenv').config(); var request = require('request'); var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session'); var cors = require('cors'); // Use Passport with OpenId Connect strategy to // authenticate users with OneLogin var passport = require('passport') var OneLoginStrategy = require('passport-openidconnect').Strategy var index = require('./routes/index'); // acr_values: 'onelogin:nist:level:1:re-auth' const baseUri = `${ process.env.OIDC_BASE_URI }/oidc/2` // Configure the OpenId Connect Strategy // with credentials obtained from OneLogin passport.use(new OneLoginStrategy({ issuer: baseUri, clientID: process.env.OIDC_CLIENT_ID, clientSecret: process.env.OIDC_CLIENT_SECRET, authorizationURL: `${baseUri}/auth`, userInfoURL: `${baseUri}/me`, tokenURL: `${baseUri}/token`, callbackURL: process.env.OIDC_REDIRECT_URI, passReqToCallback: true }, function(req, issuer, userId, profile, accessToken, refreshToken, params, cb) { console.log('issuer:', issuer); console.log('userId:', userId); console.log('accessToken:', accessToken); console.log('refreshToken:', refreshToken); console.log('params:', params); req.session.accessToken = accessToken; return cb(null, profile); })); passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); }); var app = express(); // view engine setup app.use(cors()); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'hbs'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // Passport requires session to persist the authentication // so were using express-session for this example app.use(session({ secret: 'secret squirrel', resave: false, saveUninitialized: true })) // Initialize Passport app.use(passport.initialize()); app.use(passport.session()); // Middleware for checking if a user has been authenticated // via Passport and OneLogin OpenId Connect function checkAuthentication(req,res,next){ if(req.isAuthenticated()){ next(); } else{ res.redirect("/"); } } app.use('/', index); app.get("/loginWithRedirect", (req, res) => { res.cookie("callback", req.query.callback); res.redirect("/login"); }); // Initiates an authentication request with OneLogin // The user will be redirect to OneLogin and once authenticated // they will be returned to the callback handler below app.get('/login', passport.authenticate('openidconnect', { successReturnToOrRedirect: "/", scope: 'profile' })); // Callback handler that OneLogin will redirect back to // after successfully authenticating the user app.get('/oauth/callback', passport.authenticate('openidconnect', { callback: true, successReturnToOrRedirect: '/success', failureRedirect: '/' })) app.get("/auth.js", function(req, res) { res.set('Content-Info', 'application/javascript'); if (req.isAuthenticated()) { res.send(`userInfo = ${JSON.stringify(req.user)};accessToken = "${req.session.accessToken}"`); } else { // if there is no token yet, redirect page to authentication server res.send(`window.location = 'http://localhost:3000/loginWithRedirect?callback='+encodeURIComponent(window.location.href);`); } }); app.get("/success", function(req, res) { if(req.isAuthenticated()){ res.redirect(req.cookies.callback); } else { res.redirect("/login"); } }); // Destroy both the local session and // revoke the access_token at OneLogin app.get('/logout', function(req, res){ request.post(`${baseUri}/token/revocation`, { 'form':{ 'client_id': process.env.OIDC_CLIENT_ID, 'client_secret': process.env.OIDC_CLIENT_SECRET, 'token': req.session.accessToken, 'token_type_hint': 'access_token' } },function(err, respose, body){ console.log('Session Revoked at OneLogin'); res.redirect('/'); }); }); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
Editor is loading...