MongoDB-Passwort mit "@"

89

Ich versuche, mit Mongoose in Node.js eine Verbindung zu einer MongoDB-Datenbank mit einem Benutzernamen und einem Kennwort herzustellen. Alle Dokumente sagen, dass die Verbindungszeichenfolge aussehen sollte

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

Das Passwort enthält jedoch das Zeichen '@'. Wie kann ich daraus eine Verbindungszeichenfolge machen, die Mungo verstehen wird? Kann ich das '@' im Passwort umgehen oder gibt es eine andere Verbindungsmethode, die ich verwenden muss?

iZ.
quelle
1
Nein - funktioniert nicht. Das Codieren von% 40 funktioniert ebenfalls nicht.
iZ.
4
Ich würde empfehlen, das Passwort in ein Passwort zu ändern, das kein @ -Zeichen enthält.
Sylvain Defresne
1
funktioniert die Flucht mit einem Schrägstrich? "\ @"?
DhruvPathak
1
@AmolMKulkarni: Ich weiß, dass dies das Format ist, das der Mungo verwendet, um die Verbindung anzugeben. Aber der OP wollte wissen, wie er ein Passwort verwenden kann, das ein '@' enthält? Dies ist ein Passwort wie "p @ ssw0rd" (was ein lahmes Passwort ist). Die URL wäre "monbgodb: // Benutzername: p @ ssw0rd @ host: port / db", was von Mungo falsch interpretiert wird (dh sie teilt sich beim ersten @ statt beim letzten).
Sylvain Defresne
1
Das Zeichen @in Ihrem Passwort muss in der URL verschlüsselt sein. Das codierte @Zeichen ist %40. Das %Zeichen muss jedoch auch codiert werden. Also, wenn Ihr Passwort ist, sagen wir, p@sssollte das endgültige verschlüsselte Passwort seinp%2540ss
Michael Pacheco

Antworten:

110

Verwenden Sie diese Syntax:

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

    }
);
Andrey Hohutkin
quelle
6
Diese Antwort sollte mehr Liebe bekommen, es ist wirklich nur die Konvertierung in das @ -Symbol in% 40, die den Trick macht.
Jonezy
4
Ich habe das {uri_decode_auth: true}auf den ersten Blick verpasst , aber es hat funktioniert, als ich das bemerkt habe. Vielen Dank.
Mark Rendle
1
Für Noobies {uri_decode_auth: true}sollte als separates Objekt übergeben werden, wenn Sie sich in NodeJS befinden und den nativen Treiber von mongoDB verwenden.
Koushik Shom Choudhury
5
Die Optionen [uri_decode_auth] werden ab Treiberversion 3.1 nicht unterstützt
toadead
Es gibt die Optionen [uri_decode_auth] wird nicht unterstützt, mit Mungo neuesten
Mohit Sehgal
37

Wenn Ihr Passwort Sonderzeichen enthält:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;
vanduc1102
quelle
Dies ist die Antwort, die mehr Liebe finden sollte, da sie das gesamte Problem behebt, nicht nur den sehr spezifischen Anwendungsfall des OP.
Spikyjt
28

Verwenden Sie den optionsParameter des mongoose.connectAufrufs, um das Kennwort anzugeben, anstatt es in die URL-Zeichenfolge aufzunehmen:

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pass: 'p@ssword'},
                 callback);
JohnnyHK
quelle
1
Ich mag diesen Ansatz, weil das Tippen einer weiteren Zeile nicht schadet.
S. Patel
5

Ich habe auch das gleiche Problem konfrontiert. Ich habe gelöst, indem ich ein verschlüsseltes Passwort in die Verbindungszeichenfolge eingefügt habe. Und es funktioniert einfach gut.

(1) Codieren Sie Ihr Passwort unter https://www.url-encode-decode.com.
(2) Ersetzen Sie Ihr Passwort durch ein verschlüsseltes.
(3) Es sollte gut funktionieren.

Beispiel:
Tatsächliches Kennwort: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X-
codiertes Kennwort: 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
quelle
nicht der beste Rat, um zu empfehlen, das Passwort an eine nicht vertrauenswürdige Quelle zu senden ...
guyarad
4

Versuchen Sie dieses, meine Freunde:

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

testist mein Datenbankname
administ mein Datenbankname für die Authentifizierung
viettdist mein Benutzername
abc@123ist mein Passwort

Viet Tran
quelle
4

benutze pwd statt pass, das hat bei mir für version3.2 funktioniert

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

Keine der oben genannten Lösungen hat bei mir funktioniert. Ich recherchierte weiter und fand heraus, dass ich den Parameter useNewUrlParser einschließen musste.

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

Soweit ich weiß, benötigen Sie eine bestimmte Version von MongoDB, um diese zu verwenden. Weitere Informationen finden Sie unter Vermeiden Sie die Warnung "Der aktuelle URL-String-Parser ist veraltet", indem Sie useNewUrlParser auf true setzen

Es soll die Warnung loswerden, aber die Version wirkt sich eindeutig auch auf den erforderlichen Parameter aus.

Ich habe nicht alle Sonderzeichen getestet, aber es funktioniert definitiv mit '@ # $'.

Hoffe das hilft.

Thierry
quelle
3

Wenn Sie den nativen Mongodb-Treiber Node.js verwenden, funktioniert dies für mich ab Version 3.1. Angenommen, Ihre URL enthält keine Authentifizierungsinformationen.

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

Oder wenn Sie Auth-Informationen in Ihre URL aufnehmen möchten, gehen Sie folgendermaßen vor:

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

Manchmal müssen Sie mit anderen Tools , die nur Zeichenfolgen als Verbindungszeichenfolge akzeptieren, eine Verbindung zur Datenbank herstellen. Ändern Sie einfach das @ -Zeichen mit% 40

Mist
quelle
Ändern Sie beispielsweise Folgendes (mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo in: 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
quelle
0

Diese Lösung erfordert eine zusätzliche Abhängigkeit, aber es war das, was letztendlich für mich funktioniert hat.

Fügen Sie mongodb-uriIhrem Projekt und den folgenden Zeilen zu Ihrem Code hinzu:

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

Ich habe diesen Vorschlag in mongooseder GitHub-Ausgabe Nr. 6044 gefunden .

lpacheco
quelle
0

Für diejenigen, die sich mit Mongo Compass ( MacOSx ) verbinden, gehen Sie einfach zu Ihrem Cluster -> Sicherheit (Tab) auf mongodb.com

Cluster-Sicherheit

Dann

Bearbeiten Sie Ihr Passwort (klicken Sie auf die Schaltfläche Bearbeiten in Ihrem Benutzernamen): Geben Sie hier die Bildbeschreibung ein

Sie erhalten ein Modal / Popup / Dialogfeld: Drücken Sie unter Ihrem Namen auf Passwort bearbeiten (die Schaltfläche ist standardmäßig ausgegraut, wird jedoch direkt unter Ihrem Namen angezeigt) -> Drücken Sie dann Benutzer aktualisieren

EditPassword im Dialogfeld-Popup

Weiter :

Schließen Sie Ihre Mongo DB-Kompassanwendung, wenn sie ausgeführt wird: (Mongo beenden)

Beenden Sie Mongo Compass

Nächster Schritt:

Kehren Sie zur Registerkarte Übersicht in mongodb.com zurück und wählen Sie Verbinden

Zurück zu OverView: Kehren Sie zur Übersicht zurück und wählen Sie Verbinden

Nächster Schritt:

Wählen Sie im Popup-Dialogfeld Mit MongoDB-Kompass verbinden aus und wählen Sie in der nächsten Ansicht eine Version aus, die Sie verwenden möchten (vorzugsweise VersionNumber früher ): Verbinden Sie sich mit MongoDB Compass

Version auswählen

Dann:

Kopieren Sie die Ihnen präsentierte URI-Zeichenfolge :

Kopieren Sie den Uri-String

Öffnen Sie die MongoDB Compass-Anwendung erneut:

Außerdem erhalten Sie die Option / das Popup, um die erkannte URI-Zeichenfolge zu verwenden: Klicken Sie auf Ja Uri-String erkannt

Letzter Schritt:

Geben Sie Ihr neues Passwort ein und verbinden Sie sich . Jetzt sollte Ihre Verbindung nun erfolgreich sein.Geben Sie ein neues Passwort ein und verbinden Sie sich

RileyManda
quelle
0

Benutze das,

mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true}).then(()=>console.log("DB connected"));
vrashank rao
quelle
0

Ich habe dies in Python versucht und hatte einen ähnlichen Fehler. Das hat bei mir funktioniert.

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 stellt Ihr Passwort dar und setzt voraus, dass es ein Sonderzeichen hat (z. B. @ - dargestellt durch% 40) - Benutzername ist Ihr Mongodb-Benutzername, IP - Ihre IP-Adresse und sample_db die Datenbank unter Mongodb, mit der Sie eine Verbindung herstellen möchten.

user8291021
quelle