Senha do MongoDB com “@”

93

Estou tentando me conectar a um banco de dados MongoDB com um nome de usuário e senha usando Mongoose em Node.js. Todos os documentos dizem que a string de conexão deve ser semelhante a

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

No entanto, a senha contém o caractere '@'. Como posso fazer uma string de conexão que o mangusto entenda? Posso escapar do '@' na senha ou há outro método de conexão que devo usar?

iZ.
fonte
1
Não - não funciona. Codificá-los como% 40 também não funciona.
iZ.
4
Eu recomendaria alterar a senha para uma que não inclua o caractere @.
Sylvain Defresne de
1
escapar com uma barra funciona? "\ @"?
DhruvPathak
1
@AmolMKulkarni: Eu sei que este é o formato que o mangusto usa para especificar a conexão. Mas o OP queria saber como ele poderia usar uma senha que contivesse um '@'? Esta é uma senha como "p @ ssw0rd" (que é uma senha fraca). O url seria "monbgodb: // username: p @ ssw0rd @ host: port / db", que é mal interpretado pelo mongoose (ou seja, ele se divide no primeiro @ em vez do último).
Sylvain Defresne
1
O caractere @em sua senha precisa ser codificado no URL. O @caractere codificado é %40. No entanto, o %caractere também precisa ser codificado. Então, se sua senha for, digamos, p@ssa senha codificada final deve serp%2540ss
Michael Pacheco

Respostas:

119

Use esta sintaxe:

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

    }
);
Andrey Hohutkin
fonte
7
Esta resposta deve ser mais apreciada, na verdade é apenas converter para o símbolo @ em% 40 que resolve.
jonezy
4
Eu perdi o {uri_decode_auth: true}primeiro olhar, mas funcionou assim que percebi isso. Obrigado.
Mark Rendle
1
Para noobies, {uri_decode_auth: true}deve ser passado como um objeto separado se você estiver no NodeJS e usando o driver nativo do mongoDB.
Koushik Shom Choudhury
5
as opções [uri_decode_auth] não são suportadas a partir da versão 3.1 do driver
toadead
Ele fornece as opções [uri_decode_auth] não é suportado, usando o mongoose mais recente
Mohit Sehgal
39

Se sua senha tiver caracteres especiais:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;
vanduc1102
fonte
Essa é a resposta que deve receber mais atenção, pois corrige o problema completo, não apenas o caso de uso muito específico do OP.
spikyjt
29

Use o optionsparâmetro da mongoose.connectchamada para especificar a senha em vez de incluí-la na string do URL:

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pass: 'p@ssword'},
                 callback);
JohnnyHK
fonte
1
Gosto dessa abordagem porque digitar mais uma linha não atrapalha.
S. Patel
5

Experimente este, meus amigos:

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

testé meu nome de banco de dados
adminé meu o banco de dados para autenticação
viettdé meu nome de usuário
abc@123é minha senha

Viet Tran
fonte
5

use pwd em vez de passar, que funcionou para mim na versão 3.2

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

Eu também enfrentei o mesmo problema. Resolvi adicionando uma senha codificada na string de conexão. E funciona muito bem.

(1) Codifique sua senha em https://www.url-encode-decode.com
(2) Substitua sua senha por uma codificada.
(3) Deve funcionar bem.

Por exemplo:
Senha real: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X
Senha codificada: 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 ',

prisã
fonte
1
não é o melhor conselho, recomendar o envio da senha para uma fonte não confiável ...
guyarad
Como @guyarad disse, você não deve expor a senha do seu banco de dados e não é adequado se você alterar as senhas regularmente. E a razão para este comentário é que, você não precisa de outros softwares / sites para fazer isso, encodeURIComponent()é a função integrada que pode fazer o trabalho.
27px 01 de
4

Se você usa o driver Node.js nativo Mongodb, é isso que funciona para mim a partir da versão 3.1 do driver. Suponha que seu url não contenha informações de autenticação.

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

Ou se você quiser incluir informações de autenticação em seu url, faça o seguinte:

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

Nenhuma das soluções mencionadas acima funcionou para mim. Pesquisei mais e descobri que precisava incluir o parâmetro useNewUrlParser.

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

Pelo que entendi, você precisa de uma versão específica do MongoDB para usar isso. Para mais detalhes, verifique aviso Evitar “o analisador de string de URL atual está obsoleto” definindo useNewUrlParser como verdadeiro

É para se livrar do aviso, mas claramente a versão também afeta o parâmetro necessário.

Não testei todos os caracteres especiais, mas definitivamente funciona com '@ # $'.

Espero que isto ajude.

Thierry
fonte
1

às vezes você precisa se conectar ao banco de dados usando outras ferramentas que aceitam string apenas como string de conexão. então apenas altere o sinal @ com% 40

droga
fonte
por exemplo (não se preocupe com o usuário fictício e passe) altere isso: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo para: 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
fonte
0

Esta solução requer uma dependência extra, mas foi o que finalmente funcionou para mim.

Adicione mongodb-uriao seu projeto e as seguintes linhas ao seu código:

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

Encontrei essa sugestão na mongooseedição # 6044 do GitHub .

lpacheco
fonte
0

Para aqueles que se conectam com Mongo Compass. ( MacOSx ) Basta ir para seu cluster -> Segurança (Guia) em mongodb.com

Cluster-Security

Então

edite sua senha (pressione o botão editar em seu nome de usuário): insira a descrição da imagem aqui

Você obterá um modal / pop-up / caixa de diálogo: Pressione editar senha abaixo do seu nome (o botão fica acinzentado por padrão, mas aparece logo abaixo do seu nome) -> Em seguida, pressione Atualizar usuário

Editar senha na caixa de diálogo pop-up

Próximo :

Feche o aplicativo mongo db compass se estiver executando: (Saia do Mongo)

Saia do Mongo Compass

Próxima Etapa:

Retorne à guia Visão geral em mongodb.com.and selecione Conectar

Retornar para OverView: volte para a visão geral e selecione conectar

Próxima Etapa:

Na caixa de diálogo pop-up, selecione Conectar com MongoDB Compass e, na próxima visualização, selecione uma versão que deseja usar (preferencialmente VersionNumber anterior ): Conecte-se com MongoDB Compass

selecione a versão

Então:

Copie a string URI apresentada a você:

Copiar Uri String

Reabra o aplicativo MongoDB Compass:

E lhe dará a opção / pop-up para usar o URI String detectado: Clique em Sim string uri detectada

Passo final:

Digite sua nova senha e conecte-se . Agora, sua conexão deve ser bem-sucedida.Digite a nova senha e conecte-se

RileyManda
fonte
0

Usa isto,

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

Eu estava tentando fazer isso em python e tive um erro semelhante. Isso funcionou para mim.

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 sua senha e assume que ela tem um caractere especial (por exemplo, @ - representado por% 40) - username é seu nome de usuário mongodb, ip - seu endereço IP e sample_db o banco de dados sob mongodb ao qual você deseja se conectar.

user8291021
fonte
0

Este funcionou para mim

Este é uma atualização do MongoDB 2020. Se você estiver usando um arquivo env separado, basta adicionar seu

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