İçinde "@" bulunan MongoDB şifresi


91

Node.js'de Mongoose kullanarak bir kullanıcı adı ve parola ile bir MongoDB veritabanına bağlanmaya çalışıyorum. Tüm dokümanlar bağlantı dizesinin şöyle görünmesi gerektiğini söylüyor

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

Ancak parola, içinde '@' karakterini içerir. Bundan firavun faresinin anlayacağı bir bağlantı dizesini nasıl yapabilirim? Paroladaki '@' işaretinden kaçabilir miyim yoksa kullanmam gereken başka bir bağlantı yöntemi var mı?


1
Hayır - çalışmıyor. Onlara% 40 lık takmak da işe yaramıyor.
iZ.

4
Şifreyi @ karakteri içermeyen bir şifre ile değiştirmenizi tavsiye ederim.
Sylvain Defresne

1
eğik çizgi ile kaçmak işe yarıyor mu? "\ @"?
DhruvPathak

1
@AmolMKulkarni: Firavun faresinin bağlantıyı belirtmek için kullandığı formatın bu olduğunu biliyorum. Ancak OP, '@' içeren bir şifreyi nasıl kullanabileceğini bilmek istedi? Bu, "p @ ssw0rd" gibi bir parola (ki bu topal bir paroladır). Url, firavun faresi tarafından yanlış yorumlanan "monbgodb: // kullanıcı adı: p @ ssw0rd @ ana bilgisayar: bağlantı noktası / db" olacaktır (yani son yerine ilk @'de bölünür).
Sylvain Defresne

1
@Şifrenizdeki karakterin URL'de kodlanması gerekir. Kodlanmış @karakter %40. Ancak %karakterin de kodlanması gerekir. Öyleyse, eğer şifreniz ise, diyelim ki, p@ssson şifreli şifre şu olmalıdırp%2540ss
Michael Pacheco

Yanıtlar:


115

Bu sözdizimini kullanın:

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

    }
);

6
Bu cevap daha çok sevilmeli, gerçekten işe yarayan @ sembolünü% 40'a çevirmek.
jonezy

4
{uri_decode_auth: true}İlk bakışta kaçırdım ama bunu fark ettiğimde işe yaradı. Teşekkürler.
Mark Rendle

1
Noobies için, {uri_decode_auth: true}sen NodeJS ve mongodb doğal sürücüsünü kullanarak iseniz ayrı nesne olarak iletilmelidir.
Koushik Shom Choudhury

5
[uri_decode_auth] seçenekleri, sürücü sürümü 3.1 itibariyle desteklenmemektedir
05'te toadead

Bu seçenek [uri_decode_auth] desteklenmiyor, en son mongoose kullanılarak
Mohit Sehgal

38

Şifrenizde özel karakterler varsa:

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

Bu, sadece OP'nin çok özel kullanım durumunu değil, tüm sorunu çözdüğü için daha fazla sevilmesi gereken cevaptır.
spikyjt

29

Şifreyi URL dizesine eklemek yerine belirtmek optionsiçin mongoose.connectçağrının parametresini kullanın :

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

1
Bu yaklaşımı seviyorum çünkü bir satır daha yazmanın zararı yok.
S. Patel

5

Bunu deneyin dostlarım:

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

testdb adım
admin, kimlik doğrulama için veritabanım mı
viettd, kullanıcı
abc@123adım şifrem mi


5

sürüm3.2 için benim için çalışan pass yerine pwd kullanın

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

4

Ben de aynı sorunla karşılaştım. Bağlantı dizesine şifreli şifre ekleyerek çözdüm. Ve gayet iyi çalışıyor.

(1) https://www.url-encode-decode.com adresinden şifrenizi kodlayın
(2) Şifrenizi kodlanmış olanla değiştirin.
(3) İyi çalışmalıdır.

Örneğin:
Gerçek Parola: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X
Kodlanmış Parola: ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

mongodb: // kullanıcı1: ABCDEX%24KprpvDzRTy%60%40drf.%27%3B3X@dstest.com: 1234, ds1234-test.com: 19889 / mongo-dev? replicaSet = rs-ds123546978 & ssl = true ',


1
en iyi tavsiye değil, parolayı güvenilmeyen bir kaynağa göndermeyi tavsiye etmek ...
guyarad

@Guyarad'ın dediği gibi, veritabanı şifrenizi ifşa etmemelisiniz ve şifreleri düzenli olarak değiştirmeniz uygun değildir. Ve bu yorumun nedeni, bunu yapmak için başka yazılımlara / sitelere ihtiyacınız olmamasıdır encodeURIComponent(), işi yapabilen yerleşik işlevdir.
27px

4

Mongodb yerel Node.js sürücüsünü kullanıyorsanız, 3.1 sürücü sürümünden itibaren benim için çalışan budur. URL'nizin kimlik doğrulama bilgisi içermediğini varsayın.

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

Ya da URL'nize kimlik doğrulama bilgisi eklemek istiyorsanız, şunu yapın:

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

3

Yukarıda bahsedilen çözümlerin hiçbiri benim için işe yaramadı. Daha fazla araştırdım ve useNewUrlParser parametresini dahil etmem gerektiğini öğrendim.

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

Anladığım kadarıyla, bunu kullanmak için belirli bir MongoDB sürümüne ihtiyacınız var. Daha fazla ayrıntı için useNewUrlParser'ı true olarak ayarlayarak "Geçerli URL dizesi ayrıştırıcısı kullanımdan kaldırıldı" uyarısını engelleyin seçeneğini işaretleyin.

Uyarıdan kurtulmak içindir ama açıkça sürüm gerekli parametreyi de etkiler.

Tüm özel karakterleri test etmedim ama kesinlikle '@ # $' ile çalışıyor.

Bu yardımcı olur umarım.


1

bazen sadece bağlantı dizesi olarak dizeyi kabul eden diğer araçları kullanarak DB'ye bağlanmanız gerekir . bu yüzden @ işaretini% 40 ile değiştirin


örneğin (dummy user and pass) bunu değiştirin: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo: 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

Bu çözüm fazladan bir bağımlılık gerektirir, ancak sonunda benim için işe yarayan buydu.

Ekle mongodb-uriprojeniz ve kodu aşağıdaki satıra:

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

Bu öneriyi mongooseGitHub sorunu # 6044'te buldum .


0

. Mongo Pusula ile bağlantı olanlar için ( MacOSX ) Basitçe gidin küme > - Güvenlik mongodb.com de (Tab)

Küme Güvenliği

Sonra

şifrenizi düzenleyin (kullanıcı adınızdaki düzenle düğmesine basın): görüntü açıklamasını buraya girin

Bir kalıcı / açılır pencere / iletişim kutusu göreceksiniz: Adınızın altındaki şifreyi düzenle'ye basın (düğme varsayılan olarak gri renktedir ancak adınızın hemen altında görünür) -> Ardından Kullanıcıyı Güncelle'ye basın

Diyalog Popup'ında EditPassword

Sonraki :

Çalışıyorsa mongo db compass uygulamanızı kapatın: (Mongo'dan çıkın)

Mongo Compass'tan çıkın

Sonraki adım:

İçinde Bakış Tab dön mongodb.com.and seçmek Bağlan

Genel Bakış'a dönün: genel bakışa dönün ve bağlanmayı seçin

Sonraki adım:

Açılır iletişim kutusunda MongoDB Compass ile Bağlan'ı seçin , ardından sonraki görünümde kullanmak istediğiniz sürümü seçin (tercihen daha önceki Sürüm Numarası ): MongoDB Compass ile bağlantı kurun

Sürüm seçin

Sonra:

Kopya URI dize size sunulan:

Uri Dizesini Kopyala

MongoDB Compass uygulamasını yeniden açın:

Ve size algılanan URI Dizesini kullanma seçeneğini / açılır penceresini verecektir: Evet'e tıklayın uri dizisi algılandı

Son adım:

Yeni şifrenizi girin ve Bağlanın . Şimdi bağlantınız şimdi başarılı olmalı.Yeni şifre girin ve Bağlanın


0

Bunu kullan,

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


0

Bunu python'da deniyordum ve benzer bir hatayla karşılaştım. Bu benim için çalıştı.

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% 40parola, parolanızı temsil eder ve özel bir karaktere sahip olduğunu varsayar (örn. @ -% 40 ile gösterilir) - kullanıcı adı, mongodb kullanıcı adınız, ip - ip adresiniz ve sample_db, bağlanmak istediğiniz mongodb altındaki veritabanıdır.


0

Bu benim için çalıştı

Bu bir MongoDB 2020 Güncellemesidir Ayrı bir env dosyası kullanıyorsanız,

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.