UNPKG

openhim-core

Version:

The OpenHIM core application that provides logging and routing of http requests

117 lines (87 loc) 3.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.authenticateUser = authenticateUser; exports.koaMiddleware = koaMiddleware; var _basicAuth = _interopRequireDefault(require("basic-auth")); var _winston = _interopRequireDefault(require("winston")); var _crypto = _interopRequireDefault(require("crypto")); var _bcryptjs = _interopRequireDefault(require("bcryptjs")); var _clients = require("../model/clients"); var _config = require("../config"); var _util = require("util"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const bcryptCompare = (pass, client, callback) => _bcryptjs.default.compare(pass, client.passwordHash, callback); function cryptoCompare(pass, client, callback) { const hash = _crypto.default.createHash(client.passwordAlgorithm); hash.update(pass); hash.update(client.passwordSalt); if (hash.digest('hex') === client.passwordHash) { return callback(null, true); } else { return callback(null, false); } } function comparePasswordWithClientHash(pass, client, callback) { if (Array.from(_crypto.default.getHashes()).includes(client.passwordAlgorithm)) { return cryptoCompare(pass, client, callback); } else { return bcryptCompare(pass, client, callback); } } function authenticateUser(ctx, done) { const user = (0, _basicAuth.default)(ctx.req); if (user) { return _clients.ClientModel.findOne({ clientID: user.name }, (err, client) => { if (err) { return done(err); } if (client) { if (!(client.passwordAlgorithm && client.passwordHash)) { _winston.default.warn(`${user.name} does not have a basic auth password set`); return done(null, null); } return comparePasswordWithClientHash(user.pass, client, (err, res) => { if (err) { return done(err); } if (res) { _winston.default.info(`${user.name} is authenticated.`); ctx.authenticated = client; ctx.authenticationType = 'basic'; return done(null, client); } else { _winston.default.info(`${user.name} could NOT be authenticated, trying next auth mechanism if any...`); return done(null, null); } }); } else { _winston.default.info(`${user.name} not found, trying next auth mechanism if any...`); return done(null, null); } }); } else { _winston.default.info('No basic auth details supplied, trying next auth mechanism if any...'); ctx.authenticated = null; // Set to empty object rather than null return done(null, null); } } /* * Koa middleware for authentication by basic auth */ async function koaMiddleware(ctx, next) { if (ctx.authenticated != null) { await next(); } else { const _authenticateUser = (0, _util.promisify)(authenticateUser); await _authenticateUser(ctx); if ((ctx.authenticated != null ? ctx.authenticated.clientID : undefined) != null) { ctx.header['X-OpenHIM-ClientID'] = ctx.authenticated.clientID; } await next(); } } //# sourceMappingURL=basicAuthentication.js.map