Пароль MongoDB із позначкою "@"


91

Я намагаюся підключитися до бази даних MongoDB за допомогою імені користувача та пароля, використовуючи Mongoose в Node.js. У всіх документах сказано, що рядок з'єднання повинен виглядати так

  mongodb://username:password@host:port/db

Однак пароль містить символ "@". Як я можу зробити з цього рядок зв’язку, який мангуст зрозуміє? Чи можу я уникнути символу "@" у паролі, чи є інший спосіб підключення, який мені доводиться використовувати?


1
Ні - не працює. Кодування їх% 40 також не працює.
iZ.

4
Я б рекомендував змінити пароль на такий, який не містить символу @.
Sylvain Defresne

1
працює втеча з косою рисою? "\ @"?
DhruvPathak

1
@AmolMKulkarni: Я знаю, що це формат, який використовує мангуст, щоб вказати з'єднання. Але ОП хотів знати, як він міг використовувати пароль, який містив "@"? Це пароль, такий як "p @ ssw0rd" (що є хромим паролем). URL-адреса буде "monbgodb: // ім'я користувача: p @ ssw0rd @ host: port / db", що неправильно інтерпретується мангустом (тобто вона розділяється на перший @ замість останнього).
Sylvain Defresne

1
Символ @у вашому паролі потрібно закодувати в URL-адресі. Кодований @символ - %40. Однак %символ також потрібно закодувати. Отже, якщо ваш пароль, скажімо так, p@ssостаточний закодований пароль повинен бутиp%2540ss
Майкл Пачеко

Відповіді:


115

Використовуйте цей синтаксис:

mongoClient.connect("mongodb://username:p%40ssword@host:port/dbname?authSource=admin", { 
        useNewUrlParser: true
    }, function(err, db) {

    }
);

6
Ця відповідь повинна отримати більше любові, це насправді просто перетворення символу @ на% 40, що робить трюк.
jonezy

4
Я пропустив {uri_decode_auth: true}перший погляд, але це спрацювало, коли я це помітив. Дякую.
Марк Рендл

1
Для noobies {uri_decode_auth: true}слід передавати як окремий об'єкт, якщо ви знаходитесь у NodeJS і використовуєте власний драйвер mongoDB.
Koushik Shom Choudhury

5
параметри [uri_decode_auth] не підтримуються станом на драйвер версії 3.1
toadead

Це дає параметри [uri_decode_auth] не підтримується, використовуючи мангуст останнім часом
Mohit

38

Якщо ваш пароль має спеціальні символи:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;

Це відповідь, яка повинна отримати більше любові, оскільки вона вирішує всю проблему, а не лише дуже конкретний випадок використання ОП.
spikyjt

29

Використовуйте optionsпараметр mongoose.connectвиклику, щоб вказати пароль, а не включати його в рядок URL:

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pass: 'p@ssword'},
                 callback);

1
Мені подобається такий підхід, оскільки введення ще одного рядка не заважає.
S. Patel

5

Спробуйте це, друзі мої:

    mongoose.connect("mongodb://localhost:27017/test?authSource=admin",
                     {user: 'viettd', pass: 'abc@123'});

testце моє ім'я db
adminмоє db для автентифікації
viettdце моє ім'я користувача
abc@123- мій пароль


5

використовуйте pwd замість pass, який працював у мене для версії 3.2

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pwd: 'p@ssword'},
                 callback);

4

Я теж стикався з тим самим питанням. Я вирішив, додавши закодований пароль у рядок з'єднання. І це працює дуже добре.

(1) Зашифруйте свій пароль з https://www.url-encode-decode.com
(2) Замініть свій пароль на закодований.
(3) Це має працювати добре.

Наприклад:
Фактичний пароль: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X
закодований пароль: ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

mongodb: // user1: ABCDEX%24KprpvDzRTy%60%40drf.%27%3B3X@dstest.com: 1234, ds1234-test.com: 19889 / mongo-dev? replicaSet = rs-ds123546978 & ssl = true ',


1
не найкраща порада, рекомендувати надсилати пароль ненадійному джерелу ...
гуярад

Як сказав @guyarad, ви не повинні виставляти пароль бази даних і не підходить, якщо регулярно міняти паролі. І причина цього коментаря полягає в тому, що для цього вам не потрібні інші програмні засоби / сайти, encodeURIComponent()це вбудована функція, яка може виконати цю роботу.
пікселів

4

Якщо ви використовуєте рідний драйвер Node.js Mongodb, це те, що мені підходить з версії драйвера 3.1. Припустимо, ваша URL-адреса не містить інформації про автентифікацію.

MongoClient = require('mongodb').MongoClient;
let options = {
    useNewUrlParser: true,
    auth: {
        user: 'your_usr',
        password: 'your_pwd'
    }
};
MongoClient.connect(url, options, callback);

Або якщо ви хочете включити інформацію про аутентифікацію до своєї URL-адреси, зробіть так:

let url = "mongodb://username:" + encodeURIComponent("p@ssword") + "@localhost:27017/database"

3

Жодне із згаданих вище рішень не працювало для мене. Я дослідив його далі і виявив, що мені потрібно було включити параметр useNewUrlParser.

mongoose.connect(db, {
    useNewUrlParser : true
    },
    err => {
    if (err){
        console.error('Error: ' + err)
    }
    else{
        console.log('Connected to MongoDb')
    }
})

Наскільки я розумію, вам потрібна конкретна версія MongoDB, щоб використовувати її. Щоб отримати докладнішу інформацію, поставте прапорець « Уникати попередження« Поточний синтаксичний аналізатор рядків застарілий », установивши для useNewUrlParser значення true

Це позбавлення від попередження, але очевидно, що версія також впливає на необхідний параметр.

Я не тестував усіх спеціальних символів, але це точно працює з "@ # $".

Сподіваюся, це допомагає.


1

іноді вам потрібно підключитися до БД за допомогою інших інструментів, які приймають рядок лише як рядок підключення. так що просто змініть знак @ на% 40


наприклад (не хвилюйся фіктивного користувача та передай) змініть це: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo на: mongodb: // kipkip: Nolalola22%40@ds031223.mlab.com: 3d223 / mishlo
dang

0
Also, if your password contains a percentage, %, 
 Because the percent ("%") character serves as the indicator for percent-encoded octets, it must be percent-encoded as "%25" for that octet to be used as data within a URI

for example, if your password is John%Doe, the new transformed password will be John%25Doe or
If password is Paul%20Wait, New Password will be Paul%2520Wait

mongoClient.connect("mongodb://username:John%25Doe@host:port/dbname", function(err, db) {
// password is John%Doe
    }`enter code here`
);

0

Це рішення вимагає додаткової залежності, але саме це, нарешті, спрацювало для мене.

Додайте mongodb-uriдо свого проекту та наступні рядки до свого коду:

const mongoose = require('mongoose')
const mongodbUri = require('mongodb-uri')
let mongooseUri = mongodbUri.formatMongoose(config.mongo.uri)
mongoose.connect(mongooseUri, config.mongo.options)

Я знайшов цю пропозицію у mongooseвипуску GitHub № 6044 .


0

Для тих, хто підключається до Mongo Compass. ( MacOSx ) Просто перейдіть у свій кластер -> Безпека (вкладка) на mongodb.com

Кластер-безпека

Тоді

відредагуйте свій пароль (натисніть кнопку редагування на вашому імені користувача): введіть тут опис зображення

Ви отримаєте модальний / спливаюче / діалогове вікно: натисніть редагувати пароль під своїм ім'ям (кнопка за замовчуванням сіра, але з'являється під вашим іменем) -> Потім натисніть Оновити користувача

EditPassword у діалоговому вікні

Далі :

Закрийте програму компаса mongo db, якщо вона працює: (Вийти з Mongo)

Залиште компас Mongo

Наступний крок:

Поверніться на вкладку "Огляд" на mongodb.com. І виберіть " Підключитися"

Повернутися до OverView: повернутися до огляду та вибрати підключити

Наступний крок:

У спливаючому діалоговому вікні виберіть Connect with MongoDB Compass, а потім у наступному вікні виберіть версію, яку ви хочете використовувати (бажано VersionNumber раніше ): Підключіться до MongoDB Compass

виберіть Версія

Тоді:

Скопіюйте URI Рядок представлена вам:

Скопіюйте рядок Uri

Повторно відкрити програму MongoDB Compass:

І це дасть вам можливість / спливаюче вікно для використання виявленого рядка URI: натисніть Так виявлено рядок uri

Заключний крок:

Введіть свій новий пароль і підключіться . Тепер ваше з’єднання повинно бути успішним.Введіть новий пароль та Connect




0

Я намагався це зробити в python, і у мене сталася подібна помилка. Це спрацювало для мене.

import pymongo

client = pymongo.MongoClient("mongodb://username:12%40password@ip:27017/sample_db") 
db = client.sample_db
# print the number of documents in a collection
print(db.collection.count())

Пароль 12% 40 представляє ваш пароль і припускає, що він має спеціальний символ (наприклад, @ - представлений% 40) - ім'я користувача - це ваше ім'я користувача mongodb, ip - ваша ip-адреса та sample_db база даних під mongodb, до якої ви хочете підключитися.


0

Цей працював у мене

Це оновлення MongoDB 2020 Якщо ви використовуєте окремий файл env, просто додайте свій

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.