Password MongoDB con "@" in essa


91

Sto cercando di connettermi a un database MongoDB con un nome utente e una password utilizzando Mongoose in Node.js. Tutti i documenti dicono che la stringa di connessione dovrebbe essere simile

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

Tuttavia, la password contiene il carattere "@". Come posso creare una stringa di connessione da questo che la mangusta capirà? Posso sfuggire al "@" nella password o c'è un altro metodo di connessione che devo usare?


1
No, non funziona. Neppure guadagnarli a% 40 non funziona.
iZ.

4
Consiglierei di cambiare la password con una che non includa il carattere @.
Sylvain Defresne

1
scappare con una barra funziona? "\ @"?
DhruvPathak

1
@AmolMKulkarni: So che questo è il formato che la mangusta usa per specificare la connessione. Ma l'OP voleva sapere come poteva usare una password che conteneva un "@"? Questa è una password come "p @ ssw0rd" (che è una password scadente). L'URL sarebbe "monbgodb: // username: p @ ssw0rd @ host: port / db" che è interpretato male da mongoose (cioè si divide alla prima @ invece che all'ultima).
Sylvain Defresne

1
Il carattere @nella tua password deve essere codificato nell'URL. Il @carattere codificato è %40. Tuttavia, anche il %carattere deve essere codificato. Quindi, se la tua password è, diciamo, p@ssla password codificata finale dovrebbe esserep%2540ss
Michael Pacheco

Risposte:


115

Usa questa sintassi:

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

    }
);

6
Questa risposta dovrebbe ricevere più amore, in realtà è solo la conversione nel simbolo @ in% 40 che fa il trucco.
jonezy

4
Mi è mancato {uri_decode_auth: true}a prima vista, ma ha funzionato una volta che l'ho notato. Grazie.
Mark Rendle

1
Per i noobies, {uri_decode_auth: true}dovrebbe essere passato come oggetto separato se sei in NodeJS e utilizzi il driver nativo di mongoDB.
Koushik Shom Choudhury

5
le opzioni [uri_decode_auth] non sono supportate a partire dalla versione del driver 3.1
toadead

Fornisce le opzioni [uri_decode_auth] non è supportato, utilizzando l'ultima mangusta
Mohit Sehgal

38

Se la tua password contiene caratteri speciali:

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

Questa è la risposta che dovrebbe ottenere più amore poiché risolve il problema completo, non solo il caso d'uso molto specifico dell'OP.
spikyjt

29

Utilizza il optionsparametro della mongoose.connectchiamata per specificare la password invece di includerla nella stringa dell'URL:

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

1
Mi piace questo approccio perché digitare un'altra riga non fa male.
S. Patel

5

Provate questo, amici miei:

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

testè il mio nome db
adminè mio il db per l'autenticazione
viettdè il mio nome utente
abc@123è la mia password


5

usa pwd invece di passare, che ha funzionato per me per la versione3.2

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

4

Ho anche affrontato lo stesso problema. Ho risolto aggiungendo una password codificata nella stringa di connessione. E funziona proprio bene.

(1) Codifica la tua password da https://www.url-encode-decode.com
(2) Sostituisci la tua password con una codificata.
(3) Dovrebbe funzionare bene.

Ad esempio:
Password effettiva: ABCDEX $ KrrpvDzRTy` @ drf. ';
Password codificata 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
non è il miglior consiglio, raccomandare di inviare la password a una fonte non attendibile ...
guyarad

Come ha detto @guyarad, non dovresti esporre la password del tuo database e non è adatto se cambi password regolarmente. E la ragione di questo commento è che, non hai bisogno di altri software / siti per farlo, encodeURIComponent()è la funzione integrata che può fare il lavoro.
27 px

4

Se usi il driver Node.js nativo di Mongodb, questo è ciò che funziona per me a partire dalla versione del driver 3.1. Supponi che il tuo URL non contenga informazioni sull'autenticazione.

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

O se vuoi includere le informazioni sull'autenticazione nel tuo URL, fai questo:

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

3

Nessuna delle soluzioni sopra menzionate ha funzionato per me. Ho studiato ulteriormente e ho scoperto che dovevo includere il parametro useNewUrlParser.

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

Da quello che ho capito, hai bisogno di una versione specifica di MongoDB per usarlo. Per maggiori dettagli, controlla l' avviso Evita che il parser della stringa URL corrente sia deprecato impostando useNewUrlParser su true

Serve per eliminare l'avviso ma chiaramente la versione influisce anche sul parametro richiesto.

Non ho testato tutti i caratteri speciali ma funziona sicuramente con "@ # $".

Spero che sia di aiuto.


1

a volte è necessario connettersi al DB utilizzando altri strumenti che accettano la stringa solo come stringa di connessione. quindi cambia il segno @ con% 40


ad esempio (non preoccuparti utente fittizio e pass) cambia questo: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo in: 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

Questa soluzione richiede una dipendenza extra, ma alla fine ha funzionato per me.

Aggiungi mongodb-urial tuo progetto e le seguenti righe al tuo codice:

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

Ho trovato questo suggerimento nel mongoosenumero 6044 di GitHub di .


0

Per coloro che si connettono con Mongo Compass. ( MacOSx ) Vai semplicemente al tuo cluster -> Sicurezza (Tab) su mongodb.com

Cluster-Security

Poi

modificare la password (premere il pulsante di modifica sul nome utente): inserisci qui la descrizione dell'immagine

Otterrai un modale / popup / finestra di dialogo: premi Modifica password sotto il tuo nome (il pulsante è disattivato per impostazione predefinita ma appare appena sotto il tuo nome) -> Quindi premi Aggiorna utente

Modifica password nella finestra di dialogo popup

Il prossimo :

Chiudi la tua applicazione mongo db compass se è in esecuzione: (Esci da Mongo)

Esci da Mongo Compass

Passo successivo:

Torna alla scheda Panoramica su mongodb.com e seleziona Connetti

Torna alla panoramica: tornare alla panoramica e selezionare connetti

Passo successivo:

Nella finestra di dialogo popup seleziona Connetti con MongoDB Compass, quindi nella vista successiva seleziona una versione che desideri utilizzare (preferibilmente VersionNumber precedente ): Connettiti con MongoDB Compass

seleziona Versione

Poi:

Copia la stringa URI presentata:

Copia Uri String

Riapri l'applicazione MongoDB Compass:

E ti darà l'opzione / popup per utilizzare la stringa URI rilevata: fai clic su Stringa uri rilevata

Passo finale:

Immettere la nuova password e connettersi . Ora la tua connessione dovrebbe avere successo.Immettere la nuova password e connettersi


0

Usa questo,

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


0

Stavo tentando di farlo in Python e ho avuto un errore simile. Questo ha funzionato per me.

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 rappresenta la tua password e presume che abbia un carattere speciale (es. @ - rappresentato da% 40) - username è il tuo nome utente mongodb, ip - il tuo indirizzo ip e sample_db il database sotto mongodb a cui desideri connetterti.


0

Questo ha funzionato per me

Questo è un aggiornamento MongoDB 2020.Se stai utilizzando un file env separato, aggiungi semplicemente il tuo

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.