Mật khẩu MongoDB với “@” trong đó


91

Tôi đang cố gắng kết nối với cơ sở dữ liệu MongoDB bằng tên người dùng và mật khẩu bằng Mongoose trong Node.js. Tất cả các tài liệu nói rằng chuỗi kết nối sẽ giống như

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

Tuy nhiên, mật khẩu có chứa ký tự '@' trong đó. Làm cách nào để tạo ra một chuỗi kết nối mà mongoose sẽ hiểu? Tôi có thể thoát '@' trong mật khẩu hay có phương pháp kết nối nào khác mà tôi phải sử dụng không?


1
Không - không hoạt động. Nhấn% 40 cho họ cũng không hoạt động.
iZ.

4
Tôi khuyên bạn nên thay đổi mật khẩu thành một mật khẩu không bao gồm ký tự @.
Sylvain Defresne

1
trốn thoát bằng một nhát chém có hiệu quả không? "\ @"?
DhruvPathak

1
@AmolMKulkarni: Tôi biết đây là định dạng mongoose sử dụng để chỉ định kết nối. Nhưng OP muốn biết làm thế nào anh ta có thể sử dụng mật khẩu có chứa '@'? Đây là một mật khẩu như "p @ ssw0rd" (là một mật khẩu khập khiễng). Url sẽ là "monbgodb: // username: p @ ssw0rd @ host: port / db" được mongoose hiểu sai (tức là nó tách ở chữ @ đầu tiên thay vì chữ cuối cùng).
Sylvain Defresne

1
Ký tự @trong mật khẩu của bạn cần được mã hóa trong URL. Ký @tự được mã hóa là %40. Tuy nhiên, %ký tự cũng cần được mã hóa. Vì vậy, nếu mật khẩu của bạn, cho phép nói, p@ss, mật khẩu mã hóa thức nênp%2540ss
Michael Pacheco

Câu trả lời:


115

Sử dụng cú pháp này:

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

    }
);

6
Câu trả lời này sẽ nhận được nhiều sự yêu thích hơn, nó thực sự chỉ là chuyển đổi sang biểu tượng @ thành% 40.
jonezy

4
Tôi đã bỏ {uri_decode_auth: true}qua cái nhìn đầu tiên, nhưng nó hoạt động khi tôi nhận thấy điều đó. Cảm ơn.
Mark Rendle

1
Đối với noobies, {uri_decode_auth: true}nên được chuyển như một đối tượng riêng biệt nếu bạn đang ở trong NodeJS và sử dụng trình điều khiển gốc của mongoDB.
Koushik Shom Choudhury

5
các tùy chọn [uri_decode_auth] không được hỗ trợ như các phiên bản trình điều khiển 3.1
toadead

Nó cung cấp cho các tùy chọn [uri_decode_auth] không được hỗ trợ, sử dụng mongoose mới nhất
Mohit Sehgal

38

Nếu mật khẩu của bạn có các ký tự đặc biệt:

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

Đây là câu trả lời sẽ nhận được nhiều sự yêu thích hơn vì nó khắc phục được toàn bộ vấn đề, không chỉ trường hợp sử dụng rất cụ thể của OP.
spikyjt

29

Sử dụng optionstham số của lệnh mongoose.connectgọi để chỉ định mật khẩu thay vì đưa nó vào chuỗi URL:

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

1
Tôi thích cách tiếp cận này bởi vì gõ thêm một dòng không đau.
S. Patel

5

Hãy thử cái này, các bạn của tôi:

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

testtên db của tôi
adminlà của tôi db để xác thực
viettdlà tên người dùng
abc@123của tôi là mật khẩu của tôi


5

sử dụng pwd thay vì vượt qua, điều đó đã làm việc cho tôi cho phiên bản3.2

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

4

Tôi cũng đã phải đối mặt với vấn đề tương tự. Tôi đã giải quyết bằng cách thêm mật khẩu được mã hóa vào chuỗi kết nối. Và nó hoạt động tốt.

(1) Mã hóa mật khẩu của bạn từ https://www.url-encode-decode.com
(2) Thay thế mật khẩu của bạn bằng mật khẩu được mã hóa.
(3) Nó sẽ hoạt động tốt.

Ví dụ:
Mật khẩu thực tế: ABCDEX $ KrrpvDzRTy` @ drf. ';
Mật khẩu được mã hóa 3X : ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

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


1
không phải là lời khuyên tốt nhất, đề nghị gửi mật khẩu để một nguồn không tin cậy ...
guyarad

Như @guyarad đã nói, bạn không nên để lộ mật khẩu cơ sở dữ liệu của mình và không phù hợp nếu bạn thay đổi mật khẩu thường xuyên. Và lý do cho nhận xét này là, bạn không cần phần mềm / trang web khác để làm điều đó, encodeURIComponent()là chức năng tích hợp có thể thực hiện công việc.
27px

4

Nếu bạn sử dụng trình điều khiển Node.js gốc Mongodb, đây là những gì phù hợp với tôi kể từ phiên bản trình điều khiển 3.1. Giả sử url của bạn không chứa thông tin xác thực.

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

Hoặc nếu bạn muốn đưa thông tin xác thực vào url của mình, hãy làm như sau:

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

3

Không có giải pháp nào được đề cập ở trên hiệu quả với tôi. Tôi đã nghiên cứu thêm và phát hiện ra rằng tôi phải bao gồm tham số useNewUrlParser.

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

Theo những gì tôi hiểu, bạn cần một phiên bản cụ thể của MongoDB để sử dụng. Để biết thêm chi tiết, hãy kiểm tra Tránh cảnh báo “trình phân tích chuỗi URL hiện tại không được dùng nữa” bằng cách đặt useNewUrlParser thành true

Nó là để thoát khỏi cảnh báo nhưng rõ ràng phiên bản cũng ảnh hưởng đến tham số cần thiết.

Tôi chưa thử nghiệm tất cả các ký tự đặc biệt nhưng nó chắc chắn hoạt động với '@ # $'.

Hi vọng điêu nay co ich.


1

đôi khi bạn cần kết nối với DB bằng các công cụ khác chỉ chấp nhận chuỗi là chuỗi kết nối. vì vậy chỉ cần thay đổi dấu @ bằng% 40


ví dụ (đừng lo lắng người dùng giả và pass) thay đổi cái này: mongodb: // kipkip: Nolalola22 @@ ds031223.mlab.com: 3d223 / mishlo thành: 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

Giải pháp này đòi hỏi một sự phụ thuộc bổ sung, nhưng đó là những gì cuối cùng đã làm việc cho tôi.

Thêm mongodb-urivào dự án của bạn và các dòng sau vào mã của bạn:

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

Tôi đã tìm thấy đề xuất này trong số 6044mongoose của GitHub .


0

Đối với những người kết nối với Mongo Compass. ( MacOSx ) Chỉ cần truy cập cụm của bạn -> Bảo mật (Tab) tại mongodb.com

Cluster-Security

Sau đó

chỉnh sửa mật khẩu của bạn (nhấn nút chỉnh sửa trên tên người dùng của bạn): nhập mô tả hình ảnh ở đây

Bạn sẽ nhận được một phương thức / cửa sổ bật lên / hộp thoại: Nhấn chỉnh sửa mật khẩu bên dưới tên của bạn (nút có màu xám theo mặc định nhưng xuất hiện ngay bên dưới tên của bạn) -> Sau đó nhấn Cập nhật người dùng

EditPassword trong Dialog Popup

Tiếp theo :

Đóng ứng dụng la bàn db mongo của bạn nếu nó đang chạy: (Thoát Mongo)

Thoát khỏi Mongo Compass

Bước tiếp theo:

Quay lại Tab Tổng quan trong mongodb.com. Và chọn Kết nối

Quay lại OverView: quay lại tổng quan và chọn kết nối

Bước tiếp theo:

Trong hộp thoại bật lên, chọn Kết nối với La bàn MongoDB, sau đó trong giao diện tiếp theo, hãy chọn phiên bản bạn muốn sử dụng (tốt nhất là Số phiên bản trước đó ): Kết nối với MongoDB Compass

chọn Phiên bản

Sau đó:

Sao chép các URI Chuỗi giới thiệu cho bạn:

Sao chép chuỗi Uri

Mở lại ứng dụng MongoDB La bàn:

Và nó sẽ cung cấp cho bạn tùy chọn / cửa sổ bật lên để sử dụng Chuỗi URI được phát hiện: Nhấp vào chuỗi tiểu được phát hiện

Bước cuối cùng:

Nhập mật khẩu mới của bạn và Kết nối . Bây giờ kết nối của bạn sẽ thành công.Nhập mật khẩu mới và kết nối


0

Dùng cái này,

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


0

Tôi đã thử điều này trong python và tôi gặp lỗi tương tự. Điều này đã làm việc cho tôi.

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())

Mật khẩu 12% 40 đại diện cho mật khẩu của bạn và giả sử nó có một ký tự đặc biệt (ví dụ: @ - được đại diện bởi% 40) - tên người dùng là tên người dùng mongodb của bạn, ip - địa chỉ ip của bạn và sample_db cơ sở dữ liệu dưới mongodb mà bạn muốn kết nối.


0

Cái này làm việc cho tôi

Đây là bản cập nhật MongoDB 2020 Nếu bạn đang sử dụng một tệp env riêng thì chỉ cần thêm

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.