gx
chenyc
2025-02-12 ea42ff3ebee1eeb3fb29423aa848a249441db81c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
'use strict';
 
const crypto = require('crypto');
const AuthProvider = require('./auth_provider').AuthProvider;
 
class MongoCR extends AuthProvider {
  auth(authContext, callback) {
    const connection = authContext.connection;
    const credentials = authContext.credentials;
    const username = credentials.username;
    const password = credentials.password;
    const source = credentials.source;
 
    connection.command(`${source}.$cmd`, { getnonce: 1 }, (err, result) => {
      let nonce = null;
      let key = null;
 
      // Get nonce
      if (err == null) {
        const r = result.result;
        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
      };
 
      connection.command(`${source}.$cmd`, authenticateCommand, callback);
    });
  }
}
 
module.exports = MongoCR;