Надежно используйте строку подключения MongoAtlas в Node.Js для подключения к MongoDB - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь подключиться к MongoAtlas для локального проекта. Есть ли способ разбить строку подключения на переменные, такие как имя базы данных, пароль базы данных, имя хоста базы данных и т. Д. c, которые были предоставлены мне в «Подключить ваше приложение» в части подключения (Настройки драйвера: - Узел 3.0 +). Хотя я мог бы использовать приведенный мной пример драйвера, я хотел бы сделать это с помощью mon goose .connect (). Кто-нибудь может сказать, что делать?

1 Ответ

0 голосов
/ 03 марта 2020

Да, вы можете сделать это, используя Template_literals :

process.env.uName = 'username'
process.env.password = 'password'
process.env.server = 'cluster123-abcde.mongodb.net'

const uName = process.env.uName 
const password = process.env.password
const server = process.env.server

const url = `mongodb+srv://${uName}:${password}@${server}/test?retryWrites=true&w=majority`
mongoose.connect(url, { useNewUrlParser: true });

Примечание: Если вы пользуетесь каким-либо облачным провайдером, то у них есть что-то вроде aws -secrets-manager или aws -systems-manager-parameter-store для безопасного хранения переменных среды. Вы можете получить эти значения отсюда и настроить их во время выполнения до установления соединения. Или традиционно вы можете найти способ заполнить переменные окружения во время развертывания.

Если вам это требуется более безопасным способом, то вы можете зашифровать всю строку подключения и сохранить зашифрованную строку + * 1016. * ключ где-то и во время создания соединения расшифровывайте те, чтобы установить соединение, проверьте это:

const crypto = require('crypto'); // Take use of crypto library from Node.Js
const secretKey = 'somestringlengthof32';

function decrypt(text) {
    let res = null;
    try {
        const textParts = text.split(':');
        const iv = Buffer.from(textParts.shift(), 'hex');
        const encryptedText = Buffer.from(textParts.join(':'), 'hex');
        const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(secretKey), iv);
        let decrypted = decipher.update(encryptedText);
        decrypted = Buffer.concat([decrypted, decipher.final()]);
        res = decrypted.toString();
    } catch (err) {
        logger.error('Error in decrypt func ::', err);
    }
    return res;
}

function encrypt(text) {
    const iv = crypto.randomBytes(16);
    const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(secretKey), iv);
    let encrypted = cipher.update(text);
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    return `${iv.toString('hex')}:${encrypted.toString('hex')}`;
}

const urlString = 'mongodb+srv://username:password@cluster123-abcde.mongodb.net/test?retryWrites=true&w=majority'
const encryptedString = encrypt(urlString)
console.log(encryptedString) // Store this string & secretKey somewhere in secured place & use these while connection creation by calling decrypt function
console.log(decrypt(encryptedString))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...