Hasło MongoDB zawierające znak „@”

91

Próbuję połączyć się z bazą danych MongoDB przy użyciu nazwy użytkownika i hasła przy użyciu Mongoose w Node.js. Wszystkie dokumenty mówią, że parametry połączenia powinny wyglądać jak

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

Jednak hasło zawiera znak „@”. Jak mogę zrobić z tego ciąg połączenia, który zrozumie mangusta? Czy mogę uniknąć znaku „@” w haśle, czy jest inna metoda połączenia, której muszę użyć?

iZ.
źródło
1
Nie - nie działa. Kodowanie ich a% 40 też nie działa.
iZ.
4
Zalecałbym zmianę hasła na takie, które nie zawiera znaku @.
Sylvain Defresne,
1
czy ucieczka z ukośnikiem działa? „\ @”?
DhruvPathak
1
@AmolMKulkarni: Wiem, że jest to format używany przez mangustę do określenia połączenia. Ale OP chciał wiedzieć, jak mógłby użyć hasła zawierającego znak „@”? To hasło typu „p @ ssw0rd” (które jest kiepskim hasłem). Adres URL miałby postać „monbgodb: // nazwa_użytkownika: p @ ssw0rd @ host: port / db”, co jest błędnie interpretowane przez mangustę (tj. Dzieli się na pierwszym @ zamiast na ostatnim).
Sylvain Defresne
1
Znak @w haśle musi być zakodowany w adresie URL. Zakodowany @znak to %40. Jednak %znak również musi zostać zakodowany. Tak więc, jeśli twoje hasło to, powiedzmy, p@sskońcowe zakodowane hasło powinno byćp%2540ss
Michael Pacheco,

Odpowiedzi:

115

Użyj tej składni:

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

    }
);
Andrey Hohutkin
źródło
6
Ta odpowiedź powinna uzyskać więcej miłości, tak naprawdę wystarczy przekonwertować symbol @ na% 40, który załatwia sprawę.
jonezy
4
Brakowało mi {uri_decode_auth: true}na pierwszy rzut oka, ale zadziałało, gdy to zauważyłem. Dzięki.
Mark Rendle
1
W przypadku noobies {uri_decode_auth: true}powinno być przekazywane jako oddzielny obiekt, jeśli jesteś w NodeJS i używasz natywnego sterownika mongoDB.
Koushik Shom Choudhury
5
opcje [uri_decode_auth] nie są obsługiwane od wersji sterownika 3.1
toadead
Daje opcje [uri_decode_auth] nie jest obsługiwane, używając mongoose najpóźniej
Mohit Sehgal
38

Jeśli Twoje hasło zawiera znaki specjalne:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;
vanduc1102
źródło
To jest odpowiedź, która powinna wzbudzić więcej sympatii, ponieważ rozwiązuje cały problem, a nie tylko bardzo konkretny przypadek użycia OP.
spikyjt
29

Użyj optionsparametru mongoose.connectwywołania, aby określić hasło zamiast umieszczać je w ciągu adresu URL:

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pass: 'p@ssword'},
                 callback);
JohnnyHK
źródło
1
Podoba mi się to podejście, ponieważ wpisanie jeszcze jednej linii nie boli.
S. Patel,
5

Wypróbuj ten, moi przyjaciele:

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

testto moja nazwa bazy danych
adminto moja baza danych do uwierzytelnienia
viettdmoja nazwa użytkownika
abc@123to moje hasło

Viet Tran
źródło
5

użyj pwd zamiast pass, który działał dla mnie w wersji 3.2

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pwd: 'p@ssword'},
                 callback);
AKASH
źródło
4

Miałem również do czynienia z tym samym problemem. Rozwiązałem, dodając zakodowane hasło do parametrów połączenia. I działa po prostu dobrze.

(1) Zakoduj swoje hasło z https://www.url-encode-decode.com
(2) Zastąp swoje hasło zakodowanym.
(3) Powinno działać dobrze.

Na przykład:
Rzeczywiste hasło: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X
Zakodowane hasło: ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

mongodb: // user1: ABCDEX%24KprpvDzRTy%60%40drf.%27%[email protected]: 1234, ds1234-test.com: 19889 / mongo-dev? replicaSet = rs-ds123546978 & ssl = true ',

prisan
źródło
1
nie najlepsza rada, aby polecić wysłanie hasła do niezaufanego źródła ...
guyarad
Jak powiedział @guyarad, nie powinieneś ujawniać hasła do bazy danych i nie jest odpowiednie, jeśli regularnie zmieniasz hasła. Powodem tego komentarza jest to, że nie potrzebujesz do tego innego oprogramowania / witryn, encodeURIComponent()a wbudowana funkcja może wykonać to zadanie.
pikseli
4

Jeśli używasz natywnego sterownika Mongodb Node.js, to działa u mnie od wersji sterownika 3.1. Załóżmy, że Twój adres URL nie zawiera informacji o uwierzytelnianiu.

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

Lub jeśli chcesz dołączyć informacje o uwierzytelnianiu do swojego adresu URL, zrób to:

let url = "mongodb://username:" + encodeURIComponent("p@ssword") + "@localhost:27017/database"
ropucha
źródło
3

Żadne z powyższych rozwiązań nie zadziałało. Zbadałem to dalej i odkryłem, że muszę uwzględnić parametr useNewUrlParser.

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

Z tego, co rozumiem, potrzebujesz określonej wersji MongoDB, aby z tego skorzystać. Aby uzyskać więcej informacji, zapoznaj się z ostrzeżeniem „Unikaj obecnego parsera ciągu URL jest przestarzałe”, ustawiając właściwość useNewUrlParser na wartość true

Ma to na celu pozbycie się ostrzeżenia, ale wyraźnie wersja wpływa również na wymagany parametr.

Nie testowałem wszystkich znaków specjalnych, ale na pewno działa z „@ # $”.

Mam nadzieję że to pomoże.

Thierry
źródło
1

czasami trzeba połączyć się z bazą danych za pomocą innych narzędzi, które akceptują ciąg tylko jako parametry połączenia. więc po prostu zmień znak @ za pomocą% 40

cholera
źródło
na przykład (nie martw się fałszywy użytkownik i hasło) zmień to: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo to: mongodb: // kipkip: Nolalola22%[email protected]: 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`
);
Oduwole Oluwasegun
źródło
0

To rozwiązanie wymaga dodatkowej zależności, ale to w końcu zadziałało.

Dodaj mongodb-urido projektu i następujące wiersze do kodu:

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

Znalazłem tę sugestię w mongoosenumerze 6044 GitHub .

lpacheco
źródło
0

Dla tych, którzy łączą się z Mongo Compass. ( MacOSx ) Po prostu przejdź do swojego klastra -> Bezpieczeństwo (karta) na mongodb.com

Bezpieczeństwo klastra

Następnie

edytuj swoje hasło (naciśnij przycisk edycji na swojej nazwie użytkownika): wprowadź opis obrazu tutaj

Otrzymasz modalne / wyskakujące okienko / okno dialogowe: Naciśnij edytuj hasło pod swoim imieniem (przycisk jest domyślnie wyszarzony, ale pojawia się tuż pod twoim imieniem) -> Następnie naciśnij Aktualizuj użytkownika

EditPassword w oknie dialogowym

Kolejny :

Zamknij aplikację mongo db compass, jeśli jest uruchomiona: (Quit Mongo)

Zamknij Mongo Compass

Następny krok:

Wróć do zakładki Overview w mongodb.com. I wybierz Connect

Wróć do OverView: Wróć do przeglądu i wybierz połącz

Następny krok:

W wyskakującym oknie dialogowym wybierz Połącz z MongoDB Compass, a następnie w następnym widoku wybierz wersję, której chcesz użyć (najlepiej numer wersji wcześniej ): Połącz się z MongoDB Compass

wybierz wersję

Następnie:

Skopiować URI String przedstawione Ciebie:

Skopiuj ciąg Uri

Ponownie otwórz aplikację MongoDB Compass:

I da ci opcję / wyskakujące okienko, aby użyć wykrytego ciągu URI: Kliknij Tak Wykryto ciąg uri

Ostatni krok:

Wprowadź nowe hasło i Połącz . Teraz twoje połączenie powinno się udać.Wprowadź nowe hasło i Połącz

RileyManda
źródło
0

Użyj tego,

mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true}).then(()=>console.log("DB connected"));
vrashank rao
źródło
0

Próbowałem tego w Pythonie i miałem podobny błąd. To zadziałało dla mnie.

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% 40password reprezentuje twoje hasło i zakłada, że ​​ma specjalny znak (np. @ - reprezentowany przez% 40) - nazwa użytkownika to twoja nazwa użytkownika mongodb, ip - twój adres ip, a sample_db baza danych pod mongodb, z którą chcesz się połączyć.

user8291021
źródło
0

Ten pracował dla mnie

To jest aktualizacja MongoDB 2020 Jeśli używasz osobnego pliku env, po prostu dodaj swój

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
crazyCoder
źródło