Kata sandi MongoDB dengan "@" di dalamnya


91

Saya mencoba untuk terhubung ke database MongoDB dengan nama pengguna dan kata sandi menggunakan Mongoose di Node.js. Semua dokumen mengatakan bahwa string koneksi akan terlihat seperti

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

Namun, kata sandi mengandung karakter '@' di dalamnya. Bagaimana saya bisa membuat tali penghubung dari ini sehingga luwak akan mengerti? Dapatkah saya melepaskan '@' dalam kata sandi atau adakah metode penyambungan lain yang harus saya gunakan?


1
Tidak - tidak berhasil. Mengodekannya dengan% 40 juga tidak berhasil.
iZ.

4
Saya akan merekomendasikan untuk mengubah kata sandi menjadi kata sandi yang tidak menyertakan @ character.
Sylvain Defresne

1
apakah kabur dengan tebasan bekerja? "\ @"?
DhruvPathak

1
@AmolMKulkarni: Saya tahu ini adalah format yang digunakan luwak untuk menentukan sambungan. Tapi OP ingin tahu bagaimana dia bisa menggunakan kata sandi yang mengandung '@'? Ini kata sandi seperti "p @ ssw0rd" (yang merupakan kata sandi yang lemah). Urlnya adalah "monbgodb: // username: p @ ssw0rd @ host: port / db" yang salah diartikan oleh mongoose (yaitu, ia terbagi di @ pertama, bukan yang terakhir).
Sylvain Defresne

1
Karakter @dalam kata sandi Anda perlu dikodekan di URL. @Karakter yang disandikan adalah %40. Namun, %karakter tersebut juga perlu dienkode. Jadi, jika kata sandi Anda, katakanlah,, p@sskata sandi terakhir yang disandikan harusp%2540ss
Michael Pacheco

Jawaban:


115

Gunakan sintaks ini:

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

    }
);

6
Jawaban ini seharusnya mendapatkan lebih banyak cinta, ini benar-benar hanya mengubah ke simbol @ menjadi% 40 yang berhasil.
jonezy

4
{uri_decode_auth: true}Sekilas saya melewatkannya , tetapi berhasil setelah saya menyadarinya. Terima kasih.
Mark Rendle

1
Untuk noobies, {uri_decode_auth: true}harus diteruskan sebagai objek terpisah jika Anda berada di NodeJS dan menggunakan driver asli mongoDB.
Koushik Shom Choudhury

5
opsi [uri_decode_auth] tidak didukung pada versi driver 3.1
toadead

Ini memberikan opsi [uri_decode_auth] tidak didukung, menggunakan luwak terbaru
Mohit Sehgal

38

Jika kata sandi Anda memiliki karakter khusus:

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

Ini adalah jawaban yang seharusnya mendapatkan lebih banyak cinta karena memperbaiki masalah lengkap, bukan hanya kasus penggunaan OP yang sangat spesifik.
spikyjt

29

Gunakan optionsparameter mongoose.connectpanggilan untuk menentukan kata sandi alih-alih memasukkannya dalam string URL:

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

1
Saya suka pendekatan ini karena mengetik satu baris lagi tidak ada salahnya.
S. Patel

5

Coba yang ini, teman-teman:

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

testadalah nama db saya
adminadalah saya db untuk otentikasi
viettdadalah nama pengguna
abc@123saya adalah kata sandi saya


5

gunakan pwd sebagai gantinya lulus, yang berfungsi untuk saya untuk versi3.2

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

4

Saya juga menghadapi masalah yang sama. Saya telah menyelesaikannya dengan menambahkan kata sandi yang dikodekan ke dalam string koneksi. Dan itu bekerja dengan baik.

(1) Encode password Anda dari https://www.url-encode-decode.com
(2) Ganti password Anda dengan yang dikodekan.
(3) Ini harus bekerja dengan baik.

Misalnya:
Sandi Aktual: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X
Sandi Tersandi: ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

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


1
bukan saran terbaik, untuk merekomendasikan mengirim kata sandi ke sumber yang tidak tepercaya ...
guyarad

Seperti yang dikatakan @guyarad, Anda tidak boleh mengekspos kata sandi database Anda, dan tidak cocok jika Anda mengubah kata sandi secara teratur. Dan alasan untuk komentar ini adalah, Anda tidak memerlukan perangkat lunak / situs lain untuk melakukannya, encodeURIComponent()ini adalah fungsi bawaan yang dapat melakukan pekerjaan itu.
27px

4

Jika Anda menggunakan driver Node.js asli Mongodb, ini yang berfungsi untuk saya pada versi driver 3.1. Asumsikan url Anda tidak berisi info auth.

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

Atau jika Anda ingin menyertakan info auth di url Anda, lakukan ini:

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

3

Tidak ada solusi yang disebutkan di atas yang berhasil untuk saya. Saya menelitinya lebih lanjut dan menemukan bahwa saya harus menyertakan parameter useNewUrlParser.

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

Dari apa yang saya pahami, Anda memerlukan versi MongoDB tertentu untuk menggunakan ini. Untuk lebih jelasnya, periksa Hindari peringatan "pengurai string URL saat ini tidak berlaku lagi" dengan menyetel useNewUrlParser ke true

Ini untuk menghilangkan peringatan tetapi jelas versi juga mempengaruhi parameter yang diperlukan.

Saya belum menguji semua karakter khusus tetapi pasti berfungsi dengan '@ # $'.

Semoga ini membantu.


1

terkadang Anda perlu terhubung ke DB menggunakan alat lain yang menerima string hanya sebagai string koneksi. jadi ubah saja tanda @ dengan% 40


misalnya (jangan khawatir dummy user and pass) ubah ini: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo ke: 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

Solusi ini membutuhkan ketergantungan ekstra, tetapi itulah yang akhirnya berhasil bagi saya.

Tambahkan mongodb-urike proyek Anda dan baris berikut ke kode Anda:

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

Saya menemukan saran ini di mongoosemasalah GitHub # 6044 .


0

Bagi mereka yang terhubung dengan Mongo Compass. ( MacOSx ) Cukup buka cluster Anda -> Keamanan (Tab) di mongodb.com

Keamanan Cluster

Kemudian

edit kata sandi Anda (tekan tombol edit pada nama pengguna Anda): masukkan deskripsi gambar di sini

Anda akan mendapatkan modal / popup / dialog: Tekan edit kata sandi di bawah nama Anda (tombol berwarna abu-abu secara default tetapi muncul tepat di bawah nama Anda) -> Lalu tekan Perbarui Pengguna

EditPassword dalam Dialog Popup

Lanjut :

Tutup aplikasi kompas mongo db Anda jika sedang berjalan: (Quit Mongo)

Keluar dari Kompas Mongo

Langkah berikutnya:

Kembali ke Tab Ikhtisar di mongodb.com. dan pilih Hubungkan

Kembali ke OverView: kembali ke gambaran umum dan pilih hubungkan

Langkah berikutnya:

Pada dialog popup pilih Connect with MongoDB Compass kemudian pada tampilan berikutnya pilih versi yang ingin Anda gunakan (sebaiknya VersionNumber sebelumnya ): Terhubung dengan MongoDB Compass

pilih Versi

Kemudian:

Salin yang URI String disajikan kepada Anda:

Salin String Uri

Buka kembali aplikasi MongoDB Compass:

Dan itu akan memberi Anda opsi / popup untuk menggunakan String URI terdeteksi: Klik Ya string uri terdeteksi

Langkah terakhir:

Masukkan kata sandi baru Anda dan Hubungkan . Sekarang koneksi Anda sekarang sudah berhasil.Masukkan kata sandi baru dan Hubungkan


0

Gunakan ini,

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


0

Saya mencoba ini dengan python dan saya mengalami kesalahan serupa. Ini berhasil untuk saya.

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 mewakili kata sandi Anda dan menganggapnya memiliki karakter khusus (misalnya @ - diwakili oleh% 40) - nama pengguna adalah nama pengguna mongodb Anda, ip - alamat ip Anda dan sample_db database di bawah mongodb yang ingin Anda hubungi.


0

Yang ini berhasil untuk saya

Yang ini adalah Pembaruan MongoDB 2020 Jika Anda menggunakan file env terpisah, cukup tambahkan

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.