123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- 'use strict';
- const crypto = require('crypto');
- const AuthProvider = require('./auth_provider').AuthProvider;
- /**
- * Creates a new MongoCR authentication mechanism
- *
- * @extends AuthProvider
- */
- class MongoCR extends AuthProvider {
- /**
- * Implementation of authentication for a single connection
- * @override
- */
- _authenticateSingleConnection(sendAuthCommand, connection, credentials, callback) {
- const username = credentials.username;
- const password = credentials.password;
- const source = credentials.source;
- sendAuthCommand(connection, `${source}.$cmd`, { getnonce: 1 }, (err, r) => {
- let nonce = null;
- let key = null;
- // Get nonce
- if (err == null) {
- nonce = r.nonce;
- // Use node md5 generator
- let md5 = crypto.createHash('md5');
- // Generate keys used for authentication
- md5.update(username + ':mongo:' + password, 'utf8');
- const hash_password = md5.digest('hex');
- // Final key
- md5 = crypto.createHash('md5');
- md5.update(nonce + username + hash_password, 'utf8');
- key = md5.digest('hex');
- }
- const authenticateCommand = {
- authenticate: 1,
- user: username,
- nonce,
- key
- };
- sendAuthCommand(connection, `${source}.$cmd`, authenticateCommand, callback);
- });
- }
- }
- module.exports = MongoCR;
|