Contraseña de MongoDB con "@" en ella

91

Estoy tratando de conectarme a una base de datos MongoDB con un nombre de usuario y contraseña usando Mongoose en Node.js. Todos los documentos dicen que la cadena de conexión debería verse así

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

Sin embargo, la contraseña contiene el carácter '@'. ¿Cómo puedo hacer una cadena de conexión con esto que la mangosta entenderá? ¿Puedo escapar de la '@' en la contraseña o hay otro método de conexión que deba usar?

iZ.
fuente
1
No, no funciona. Codificarlos con un% 40 tampoco funciona.
iZ.
4
Recomendaría cambiar la contraseña por una que no incluya el carácter @.
Sylvain Defresne
1
¿Funciona escapar con una barra? "\ @"?
DhruvPathak
1
@AmolMKulkarni: Sé que este es el formato que usa la mangosta para especificar la conexión. Pero el OP quería saber cómo podía usar una contraseña que contenía una '@'. Esta es una contraseña como "p @ ssw0rd" (que es una contraseña poco convincente). La URL sería "monbgodb: // username: p @ ssw0rd @ host: port / db", que es mal interpretada por mangosta (es decir, se divide en la primera @ en lugar de la última).
Sylvain Defresne
1
El carácter @de su contraseña debe estar codificado en la URL. El @carácter codificado es %40. Sin embargo, el %carácter también debe estar codificado. Entonces, si su contraseña es, digamos, p@ssla contraseña codificada final debería serp%2540ss
Michael Pacheco

Respuestas:

115

Utilice esta sintaxis:

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

    }
);
Andrey Hohutkin
fuente
6
Esta respuesta debería recibir más amor, en realidad es solo convertir al símbolo @ a% 40 lo que hace el truco.
jonezy
4
Echaba de menos el {uri_decode_auth: true}a primera vista, pero funcionó una vez que lo noté. Gracias.
Mark Rendle
1
Para los novatos, {uri_decode_auth: true}debe pasarse como un objeto separado si está en NodeJS y usa el controlador nativo de mongoDB.
Koushik Shom Choudhury
5
las opciones [uri_decode_auth] no son compatibles a partir de la versión del controlador 3.1
toadead
Da las opciones [uri_decode_auth] no es compatible, usando mongoose último
Mohit Sehgal
38

Si su contraseña tiene caracteres especiales:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;
vanduc1102
fuente
Esta es la respuesta que debería recibir más atención ya que soluciona el problema completo, no solo el caso de uso muy específico del OP.
spikyjt
29

Utilice el optionsparámetro de la mongoose.connectllamada para especificar la contraseña en lugar de incluirla en la cadena de URL:

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pass: 'p@ssword'},
                 callback);
JohnnyHK
fuente
1
Me gusta este enfoque porque escribir una línea más no duele.
S. Patel
5

Prueba este, amigos míos:

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

testes mi nombre de base de datos
admines mi base de datos para la autenticación
viettdes mi nombre de usuario
abc@123es mi contraseña

Viet Tran
fuente
5

use pwd en lugar de pasar, eso me funcionó para la versión3.2

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

También me he enfrentado al mismo problema. Lo resolví agregando una contraseña codificada en la cadena de conexión. Y funciona muy bien.

(1) Codifique su contraseña de https://www.url-encode-decode.com
(2) Reemplace su contraseña por una codificada.
(3) Debería funcionar bien.

Por ejemplo:
Contraseña real: ABCDEX $ KrrpvDzRTy` @ drf. ';
Contraseña codificada 3X : ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

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

prisan
fuente
1
no es el mejor consejo, recomendar enviar la contraseña a una fuente que no es de confianza ...
guyarad
Como dijo @guyarad, no debe exponer la contraseña de su base de datos y no es adecuado si cambia las contraseñas con regularidad. Y la razón de este comentario es que, no necesita otros softwares / sitios para hacer eso, encodeURIComponent()es la función incorporada la que puede hacer el trabajo.
27px
4

Si usa el controlador Node.js nativo de Mongodb, esto es lo que me funciona a partir de la versión 3.1 del controlador. Suponga que su URL no contiene información de autenticación.

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

O si desea incluir información de autenticación en su URL, haga esto:

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

Ninguna de las soluciones mencionadas anteriormente funcionó para mí. Lo investigué más y descubrí que tenía que incluir el parámetro useNewUrlParser.

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

Por lo que tengo entendido, necesita una versión específica de MongoDB para poder usar esto. Para obtener más detalles, marque la advertencia Evitar que el analizador de cadenas de URL actual esté obsoleto estableciendo useNewUrlParser en verdadero

Es para deshacerse de la advertencia pero claramente la versión también afecta el parámetro requerido.

No he probado todos los caracteres especiales, pero definitivamente funciona con '@ # $'.

Espero que esto ayude.

Thierry
fuente
1

a veces necesita conectarse a la base de datos utilizando otras herramientas que aceptan cadenas solo como cadena de conexión. así que solo cambia el signo @ con% 40

maldición
fuente
por ejemplo (no se preocupe usuario ficticio y pase) cambie esto: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo a: 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
fuente
0

Esta solución requiere una dependencia adicional, pero fue lo que finalmente funcionó para mí.

Agregue mongodb-uria su proyecto y las siguientes líneas a su código:

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

Encontré esta sugerencia en mongooseel número de GitHub # 6044 .

lpacheco
fuente
0

Para aquellos que se conectan con Mongo Compass. ( MacOSx ) Simplemente vaya a su clúster -> Seguridad (pestaña) en mongodb.com

Seguridad de clúster

Entonces

edite su contraseña (presione el botón editar en su nombre de usuario): ingrese la descripción de la imagen aquí

Obtendrá un cuadro de diálogo modal / emergente: presione editar contraseña debajo de su nombre (el botón está atenuado de forma predeterminada, pero aparece justo debajo de su nombre) -> Luego presione Actualizar usuario

Editar contraseña en el cuadro de diálogo emergente

Siguiente :

Cierre su aplicación mongo db compass si se está ejecutando: (Salga de Mongo)

Salir de Mongo Compass

Próximo paso:

Regrese a la pestaña Descripción general en mongodb.com y seleccione Conectar

Volver a Vista general: volver a la vista general y seleccionar conectar

Próximo paso:

En el cuadro de diálogo emergente, seleccione Conectar con MongoDB Compass y luego, en la siguiente vista, seleccione la versión que desee usar (preferiblemente VersionNumber anterior ): Conéctese con MongoDB Compass

seleccionar versión

Entonces:

Copie la cadena URI que se le presentó:

Copiar cadena Uri

Vuelva a abrir la aplicación MongoDB Compass:

Y le dará la opción / ventana emergente para usar la cadena URI detectada: haga clic en cadena uri detectada

Último paso:

Ingrese su nueva contraseña y Conéctese . Ahora su conexión debería ser exitosa.Ingrese la nueva contraseña y conecte

RileyManda
fuente
0

Utilizar esta,

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

Estaba intentando esto en Python y tuve un error similar. Esto funcionó para mí.

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 representa su contraseña y asume que tiene un carácter especial (por ejemplo, @ - representado por% 40) - nombre de usuario es su nombre de usuario mongodb, ip - su dirección IP y sample_db la base de datos bajo mongodb a la que desea conectarse.

usuario8291021
fuente
0

Este funcionó para mi

Esta es una actualización de MongoDB 2020.Si está utilizando un archivo env separado, simplemente agregue su

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