123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // Copyright Epic Games, Inc. All Rights Reserved.
- // Adapted from
- // * https://blog.risingstack.com/node-hero-node-js-authentication-passport-js/
- // * https://github.com/RisingStack/nodehero-authentication/tree/master/app
- // * https://github.com/passport/express-4.x-local-example
- const passport = require('passport');
- const session = require('express-session');
- const bcrypt = require('bcryptjs');
- const LocalStrategy = require('passport-local').Strategy;
- const path = require('path');
- const fs = require('fs');
- var db = require('./db');
- function initPassport (app) {
- // Generate session secret if it doesn't already exist and save it to file for use next time
- let config = {};
- let configPath = path.join(__dirname, './config.json');
- if (fs.existsSync(configPath)) {
- let content = fs.readFileSync(configPath, 'utf8');
- try {
- config = JSON.parse(content);
- } catch (e) {
- console.log(`Error with config file '${configPath}': ${e}`);
- }
- }
- if(!config.sessionSecret){
- config.sessionSecret = bcrypt.genSaltSync(12);
- let content = JSON.stringify(config);
- fs.writeFileSync(configPath, content);
- }
- // Setup session id settings
- app.use(session({
- secret: config.sessionSecret,
- resave: false,
- saveUninitialized: false,
- cookie: {
- secure: true,
- maxAge: 24 * 60 * 60 * 1000 /* 1 day */
- //maxAge: 5 * 1000 /* 5 seconds */
- }
- }));
-
- app.use(passport.initialize());
- app.use(passport.session());
-
- passport.serializeUser(function(user, cb) {
- cb(null, user.id);
- });
- passport.deserializeUser(function(id, cb) {
- db.users.findById(id, function (err, user) {
- if (err) { return cb(err); }
- cb(null, user);
- });
- });
- console.log('Setting up auth');
- passport.use(new LocalStrategy(
- (username, password, callback) => {
- db.users.findByUsername(username, (err, user) => {
- if (err) {
- console.log(`Unable to login '${username}', error ${err}`);
- return callback(err);
- }
-
- // User not found
- if (!user) {
- console.log(`User '${username}' not found`);
- return callback(null, false);
- }
- // Always use hashed passwords and fixed time comparison
- bcrypt.compare(password, user.passwordHash, (err, isValid) => {
- if (err) {
- console.log(`Error comparing password for user '${username}': ${err}`);
- return callback(err);
- }
- if (!isValid) {
- console.log(`Password incorrect for user '${username}'`)
- return callback(null, false);
- }
- console.log(`User '${username}' logged in`);
- return callback(null, user);
- });
- })
- }
- ));
-
- passport.authenticationMiddleware = function authenticationMiddleware (redirectUrl) {
- return function (req, res, next) {
- if (req.isAuthenticated()) {
- return next();
- }
- // Set redirectTo property so that user can be redirected back there after logging in
- //console.log(`Original request path '${req.originalUrl}'`);
- req.session.redirectTo = req.originalUrl;
- res.redirect(redirectUrl);
- }
- }
- }
- module.exports = initPassport;
|