MongoDB รหัสผ่านที่มี“ @” อยู่


93

ฉันกำลังพยายามเชื่อมต่อกับฐานข้อมูล MongoDB ด้วยชื่อผู้ใช้และรหัสผ่านโดยใช้ Mongoose ใน Node.js เอกสารทั้งหมดบอกว่าสตริงการเชื่อมต่อควรมีลักษณะดังนี้

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

อย่างไรก็ตามรหัสผ่านมีอักขระ "@" อยู่ด้วย ฉันจะสร้างสตริงการเชื่อมต่อจากสิ่งนี้ที่พังพอนจะเข้าใจได้อย่างไร ฉันสามารถหลีกเลี่ยง '@' ในรหัสผ่านหรือมีวิธีการเชื่อมต่ออื่นที่ฉันต้องใช้?


1
ไม่ - ไม่ทำงาน การเข้ารหัสเป็น% 40 ก็ไม่ได้ผลเช่นกัน
iZ.

4
ฉันอยากจะแนะนำให้เปลี่ยนรหัสผ่านเป็นรหัสที่ไม่มีอักขระ @
Sylvain Defresne

1
การหลบหนีด้วยการเฉือนได้ผลหรือไม่? "\ @"?
DhruvPathak

1
@AmolMKulkarni: ฉันรู้ว่านี่เป็นรูปแบบที่พังพอนใช้เพื่อระบุการเชื่อมต่อ แต่ OP อยากรู้ว่าเขาจะใช้รหัสผ่านที่มี "@" ได้อย่างไร? รหัสผ่านเช่น "p @ ssw0rd" (ซึ่งเป็นรหัสผ่านที่ง่อย) URL จะเป็น "monbgodb: // username: p @ ssw0rd @ host: port / db" ซึ่งพังพอนตีความผิด (กล่าวคือแยกที่ @ ตัวแรกแทนที่จะเป็นตัวสุดท้าย)
Sylvain Defresne

1
@ต้องเข้ารหัสอักขระในรหัสผ่านของคุณใน URL เข้ารหัสตัวอักษร@ %40อย่างไรก็ตาม%อักขระจะต้องได้รับการเข้ารหัสด้วย ดังนั้นหากรหัสผ่านของคุณคือรหัสผ่านที่p@ssเข้ารหัสสุดท้ายควรเป็นp%2540ss
Michael Pacheco

คำตอบ:


119

ใช้ไวยากรณ์นี้:

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

    }
);

7
คำตอบนี้ควรได้รับความรักมากขึ้น แต่จริงๆแล้วเพียงแค่แปลงสัญลักษณ์ @ เป็น% 40 เท่านั้นที่หลอกลวง
ร่าเริง

4
ฉันพลาดใน{uri_decode_auth: true}ตอนแรก แต่มันได้ผลทันทีที่ฉันสังเกตเห็นสิ่งนั้น ขอบคุณ.
Mark Rendle

1
สำหรับ noobies {uri_decode_auth: true}ควรส่งผ่านเป็นอ็อบเจ็กต์แยกต่างหากหากคุณอยู่ใน NodeJS และใช้ไดรเวอร์เนทีฟของ mongoDB
Koushik Shom Choudhury

5
ตัวเลือก [uri_decode_auth] ไม่ได้รับการสนับสนุนสำหรับไดรเวอร์เวอร์ชัน 3.1
toadead

มันทำให้ตัวเลือก [uri_decode_auth] ไม่รองรับโดยใช้พังพอนล่าสุด
Mohit Sehgal

39

หากรหัสผ่านของคุณมีอักขระพิเศษ:

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

นี่คือคำตอบที่ควรได้รับความรักมากขึ้นเนื่องจากสามารถแก้ไขปัญหาได้อย่างสมบูรณ์ไม่ใช่เฉพาะกรณีการใช้งานที่เฉพาะเจาะจงของ OP
spikyjt

29

ใช้optionsพารามิเตอร์ของการmongoose.connectเรียกเพื่อระบุรหัสผ่านแทนที่จะรวมไว้ในสตริง URL:

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

1
ฉันชอบแนวทางนี้เพราะพิมพ์อีกบรรทัดไม่เจ็บ
S. Patel

5

ลองอันนี้เพื่อนของฉัน:

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

testคือชื่อฐานข้อมูลของฉัน
adminคือฐานข้อมูลสำหรับการตรวจสอบสิทธิ์
viettdคือชื่อผู้ใช้
abc@123ของฉันคือรหัสผ่านของฉัน


5

ใช้ pwd แทน pass ซึ่งใช้ได้กับฉันสำหรับ version3.2

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

4

ฉันก็ประสบปัญหาเดียวกัน ฉันได้แก้ไขโดยการเพิ่มรหัสผ่านที่เข้ารหัสลงในสตริงการเชื่อมต่อ และมันก็ใช้ได้ดี

(1) เข้ารหัสรหัสผ่านของคุณจากhttps://www.url-encode-decode.com
(2) แทนที่รหัสผ่านของคุณด้วยรหัสที่เข้ารหัส
(3) ควรใช้งานได้ดี

ตัวอย่างเช่น
รหัสผ่านจริง: ABCDEX $ KrrpvDzRTy` @ drf ';
รหัสผ่านเข้ารหัส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
ไม่ใช่คำแนะนำที่ดีที่สุดแนะนำให้ส่งรหัสผ่านไปยังแหล่งที่ไม่น่าเชื่อถือ ...
guyarad

ดังที่ @guyarad กล่าวว่าคุณไม่ควรเปิดเผยรหัสผ่านฐานข้อมูลของคุณและไม่เหมาะหากคุณเปลี่ยนรหัสผ่านเป็นประจำ และเหตุผลสำหรับความคิดเห็นนี้คือคุณไม่จำเป็นต้องมีซอฟต์แวร์ / ไซต์อื่น ๆ ในการทำเช่นนั้นencodeURIComponent()เป็นฟังก์ชันในตัวที่สามารถทำงานได้
27px

4

หากคุณใช้ไดรเวอร์ Mongodb Node.js แบบเนทีฟนี่คือสิ่งที่เหมาะกับฉันในเวอร์ชัน 3.1 ไดรเวอร์ สมมติว่า URL ของคุณไม่มีข้อมูลการตรวจสอบสิทธิ์

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

หรือหากคุณต้องการรวมข้อมูลการตรวจสอบสิทธิ์ใน url ของคุณให้ทำดังนี้:

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

3

วิธีแก้ปัญหาที่กล่าวมาข้างต้นไม่ได้ผลสำหรับฉัน ฉันค้นคว้าเพิ่มเติมและพบว่าฉันต้องรวมพารามิเตอร์ useNewUrlParser

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

จากสิ่งที่ฉันเข้าใจคุณต้องมี MongoDB เวอร์ชันเฉพาะเพื่อที่จะใช้สิ่งนี้ สำหรับรายละเอียดเพิ่มเติมให้เลือกคำเตือนหลีกเลี่ยง“ ตัวแยกวิเคราะห์สตริง URL ปัจจุบันเลิกใช้งาน” โดยตั้งค่า useNewUrlParser เป็น true

มันคือการกำจัดคำเตือน แต่เวอร์ชันนี้ก็มีผลต่อพารามิเตอร์ที่ต้องการเช่นกัน

ฉันยังไม่ได้ทดสอบอักขระพิเศษทั้งหมด แต่ใช้ได้กับ "@ # $" อย่างแน่นอน

หวังว่านี่จะช่วยได้


1

บางครั้งคุณต้องเชื่อมต่อกับฐานข้อมูลโดยใช้เครื่องมืออื่นที่ยอมรับสตริงเป็นสตริงการเชื่อมต่อเท่านั้น ดังนั้นเพียงแค่เปลี่ยนเครื่องหมาย @ ด้วย% 40


ตัวอย่างเช่น (ไม่ต้องกังวลผู้ใช้ดัมมี่และพาส) เปลี่ยนสิ่งนี้: 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

โซลูชันนี้ต้องการการพึ่งพาเพิ่มเติม แต่สุดท้ายก็เป็นสิ่งที่ใช้ได้ผลสำหรับฉัน

เพิ่มmongodb-uriในโครงการของคุณและบรรทัดต่อไปนี้ในรหัสของคุณ:

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

ผมพบว่าคำแนะนำนี้ในmongoose's GitHub ปัญหา# 6044


0

สำหรับผู้ที่เชื่อมต่อกับ Mongo Compass ( MacOSx ) เพียงไปที่คลัสเตอร์ของคุณ-> ความปลอดภัย (แท็บ) ที่ mongodb.com

คลัสเตอร์ - ความปลอดภัย

แล้ว

แก้ไขรหัสผ่านของคุณ (กดปุ่มแก้ไขบนชื่อผู้ใช้ของคุณ): ป้อนคำอธิบายภาพที่นี่

คุณจะได้รับโมดอล / ป๊อปอัป / ไดอะล็อก: กดแก้ไขรหัสผ่านใต้ชื่อของคุณ (ปุ่มจะเป็นสีเทาตามค่าเริ่มต้น แต่จะปรากฏอยู่ใต้ชื่อของคุณ) -> จากนั้นกดอัปเดตผู้ใช้

EditPassword ใน Dialog Popup

ถัดไป :

ปิดแอปพลิเคชั่น mongo db เข็มทิศหากกำลังทำงาน: (ออกจาก Mongo)

ออกจาก Mongo Compass

ขั้นตอนต่อไป:

กลับไปที่แท็บภาพรวมใน mongodb.com แล้วเลือกเชื่อมต่อ

กลับไปที่ OverView: กลับไปที่ภาพรวมและเลือกเชื่อมต่อ

ขั้นตอนต่อไป:

ในกล่องโต้ตอบป๊อปอัปให้เลือกเชื่อมต่อกับ MongoDB Compassจากนั้นในมุมมองถัดไปให้เลือกเวอร์ชันที่คุณต้องการใช้ (ควรเป็นVersionNumber ก่อนหน้านี้ ): เชื่อมต่อกับ MongoDB Compass

เลือกเวอร์ชัน

จากนั้น:

คัดลอกURI Stringนำเสนอให้คุณ:

คัดลอก Uri String

เปิดแอปพลิเคชั่น MongoDB Compass อีกครั้ง:

และจะให้ตัวเลือก / ป๊อปอัปในการใช้ URI String ที่ตรวจพบ: คลิกYes ตรวจพบสตริง uri

ขั้นตอนสุดท้าย:

ป้อนรหัสผ่านใหม่ของคุณและการเชื่อมต่อ ตอนนี้การเชื่อมต่อของคุณควรจะสำเร็จแล้วป้อนรหัสผ่านใหม่และเชื่อมต่อ




0

ฉันพยายามทำใน python และมีข้อผิดพลาดที่คล้ายกัน สิ่งนี้ได้ผลสำหรับฉัน

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% 40 รหัสผ่านแสดงรหัสผ่านของคุณและถือว่ามีอักขระพิเศษ (เช่น @ - แทนด้วย% 40) - ชื่อผู้ใช้คือชื่อผู้ใช้ mongodb ของคุณ, ip - ที่อยู่ IP ของคุณและ sample_db ฐานข้อมูลภายใต้ mongodb ที่คุณต้องการเชื่อมต่อ


0

อันนี้ใช้ได้ผลสำหรับฉัน

อันนี้เป็นการอัปเดต MongoDB 2020 หากคุณใช้ไฟล์ env แยกจากกันให้เพิ่มไฟล์

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.