Mot de passe MongoDB avec "@" dedans

91

J'essaie de me connecter à une base de données MongoDB avec un nom d'utilisateur et un mot de passe en utilisant Mongoose dans Node.js. Tous les documents indiquent que la chaîne de connexion devrait ressembler à

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

Cependant, le mot de passe contient le caractère «@». Comment puis-je créer une chaîne de connexion que la mangouste comprendra? Puis-je échapper au «@» dans le mot de passe ou y a-t-il une autre méthode de connexion que je dois utiliser?

iZ.
la source
1
Non - ne fonctionne pas. Leur enodant un% 40 ne fonctionne pas non plus.
iZ.
4
Je recommanderais de changer le mot de passe en un mot qui n'inclut pas le caractère @.
Sylvain Defresne
1
est-ce que s'échapper avec une barre oblique fonctionne? "\ @"?
DhruvPathak
1
@AmolMKulkarni: Je sais que c'est le format utilisé par la mangouste pour spécifier la connexion. Mais le PO voulait savoir comment il pouvait utiliser un mot de passe contenant un «@»? C'est un mot de passe comme "p @ ssw0rd" (qui est un mot de passe boiteux). L'URL serait "monbgodb: // nom d'utilisateur: p @ ssw0rd @ host: port / db" qui est mal interprétée par mangouste (c'est-à-dire qu'elle se divise au premier @ au lieu du dernier).
Sylvain Defresne
1
Le caractère @de votre mot de passe doit être encodé dans l'URL. Le @caractère encodé est %40. Cependant, le %caractère doit également être encodé. Donc, si votre mot de passe est, disons, p@ssle mot de passe codé final devrait êtrep%2540ss
Michael Pacheco

Réponses:

115

Utilisez cette syntaxe:

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

    }
);
Andrey Hohutkin
la source
6
Cette réponse devrait susciter plus d'amour, c'est simplement la conversion du symbole @ en% 40 qui fait l'affaire.
jonezy
4
J'ai raté le {uri_decode_auth: true}premier coup d'œil, mais cela a fonctionné une fois que j'ai remarqué cela. Merci.
Mark Rendle
1
Pour noobies, {uri_decode_auth: true}doit être passé comme un objet séparé si vous êtes dans NodeJS et que vous utilisez le pilote natif de mongoDB.
Koushik Shom Choudhury
5
les options [uri_decode_auth] ne sont pas prises en charge à partir de la version 3.1 du pilote
toadead
Il donne les options [uri_decode_auth] n'est pas pris en charge, en utilisant la dernière
mongoose
38

Si votre mot de passe comporte des caractères spéciaux:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;
vanduc1102
la source
C'est la réponse qui devrait être plus appréciée car elle résout le problème complet, pas seulement le cas d'utilisation très spécifique de l'OP.
spikyjt
29

Utilisez le optionsparamètre de l' mongoose.connectappel pour spécifier le mot de passe au lieu de l'inclure dans la chaîne d'URL:

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pass: 'p@ssword'},
                 callback);
JohnnyHK
la source
1
J'aime cette approche car taper une ligne de plus ne fait pas de mal.
S. Patel
5

Essayez celui-ci, mes amis:

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

testest mon nom de
adminbase de données
viettdest mon nom de base de données pour l'authentification est mon nom d'utilisateur
abc@123est mon mot de passe

Viet Tran
la source
5

utilisez pwd à la place, cela a fonctionné pour moi pour la version3.2

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

J'ai également été confronté au même problème. J'ai résolu en ajoutant un mot de passe codé dans la chaîne de connexion. Et cela fonctionne très bien.

(1) Encodez votre mot de passe depuis https://www.url-encode-decode.com
(2) Remplacez votre mot de passe par un encodé.
(3) Cela devrait bien fonctionner.

Par exemple:
Mot de passe réel: ABCDEX $ KrrpvDzRTy` @ drf. ';
Mot de passe codé 3X : ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

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

prisonnier
la source
1
pas le meilleur conseil, recommander l'envoi du mot de passe à une source non fiable ...
guyarad
Comme @guyarad l'a dit, vous ne devriez pas exposer le mot de passe de votre base de données et ne convient pas si vous changez régulièrement de mot de passe. Et la raison de ce commentaire est que, vous n'avez pas besoin d'autres logiciels / sites pour le faire, encodeURIComponent()c'est la fonction intégrée qui peut faire le travail.
27px
4

Si vous utilisez le pilote Node.js natif de Mongodb, c'est ce qui fonctionne pour moi à partir de la version 3.1 du pilote. Supposons que votre URL ne contienne pas d'informations d'authentification.

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

Ou si vous souhaitez inclure des informations d'authentification dans votre URL, procédez comme suit:

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

Aucune des solutions mentionnées ci-dessus n'a fonctionné pour moi. J'ai fait des recherches plus approfondies et j'ai découvert que je devais inclure le paramètre useNewUrlParser.

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

D'après ce que je comprends, vous avez besoin d'une version spécifique de MongoDB pour l'utiliser. Pour plus de détails, vérifiez l' avertissement "Éviter l'analyseur de chaîne d'URL actuel est obsolète" en définissant useNewUrlParser sur true.

Il s'agit de se débarrasser de l'avertissement mais il est clair que la version affecte également le paramètre requis.

Je n'ai pas testé tous les caractères spéciaux mais cela fonctionne définitivement avec '@ # $'.

J'espère que cela t'aides.

Thierry
la source
1

Parfois, vous devez vous connecter à la base de données à l'aide d'autres outils qui n'acceptent la chaîne que comme chaîne de connexion. alors changez simplement le signe @ avec% 40

dang
la source
par exemple (ne vous inquiétez pas de l'utilisateur factice et passez) changez ceci: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo en: mongodb: // kipkip: Nolalola22%[email protected]: 3d223 / mishlo
dang le
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
la source
0

Cette solution nécessite une dépendance supplémentaire, mais c'est ce qui a finalement fonctionné pour moi.

Ajoutez mongodb-urià votre projet et les lignes suivantes à votre code:

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

J'ai trouvé cette suggestion dans mongoosele numéro 6044 de GitHub .

lpacheco
la source
0

Pour ceux qui se connectent à Mongo Compass. ( MacOSx ) Accédez simplement à votre cluster -> Sécurité (onglet) sur mongodb.com

Cluster-Sécurité

ensuite

modifiez votre mot de passe (appuyez sur le bouton modifier de votre nom d'utilisateur): entrez la description de l'image ici

Vous obtiendrez un modal / popup / dialogue: Appuyez sur modifier le mot de passe sous votre nom (le bouton est grisé par défaut mais apparaît juste sous votre nom) -> puis appuyez sur Mettre à jour l'utilisateur

Modifier le mot de passe dans la fenêtre contextuelle de la boîte de dialogue

Suivant :

Fermez votre application mongo db compass si elle est en cours d'exécution: (Quittez Mongo)

Quitter Mongo Compass

L'étape suivante:

Revenez à l'onglet Présentation sur mongodb.com et sélectionnez Se connecter

Revenir à OverView: revenir à l'aperçu et sélectionner se connecter

L'étape suivante:

Dans la boîte de dialogue contextuelle, sélectionnez Se connecter avec MongoDB Compass, puis dans la vue suivante, sélectionnez une version que vous souhaitez utiliser (de préférence Numéro de version plus tôt ): Connectez-vous avec MongoDB Compass

sélectionner la version

Ensuite:

Copiez la chaîne URI qui vous est présentée:

Copier la chaîne Uri

Rouvrir l'application MongoDB Compass:

Et il vous donnera l'option / popup pour utiliser la chaîne URI détectée: Cliquez sur Oui chaîne uri détectée

Dernière étape:

Entrez votre nouveau mot de passe et connectez - vous . Votre connexion devrait maintenant être réussie.Entrez le nouveau mot de passe et connectez-vous

RileyManda
la source
0

Utilisez ceci,

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

J'essayais cela en python et j'ai eu une erreur similaire. Cela a fonctionné pour moi.

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 représente votre mot de passe et suppose qu'il a un caractère spécial (par exemple @ - représenté par% 40) - username est votre nom d'utilisateur mongodb, ip - votre adresse IP et sample_db la base de données sous mongodb à laquelle vous souhaitez vous connecter.

user8291021
la source
0

Celui-ci a fonctionné pour moi

Celui-ci est une mise à jour MongoDB 2020 Si vous utilisez un fichier env séparé, ajoutez simplement votre

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
crazyCoder
la source