"@"가있는 MongoDB 비밀번호


91

Node.js에서 Mongoose를 사용하여 사용자 이름과 비밀번호로 MongoDB 데이터베이스에 연결하려고합니다. 모든 문서는 연결 문자열이 다음과 같아야한다고 말합니다.

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

그러나 암호에는 '@'문자가 포함되어 있습니다. 몽구스가 이해할 수있는 연결 문자열을 어떻게 만들 수 있습니까? 비밀번호에서 '@'를 이스케이프 할 수 있습니까? 아니면 다른 연결 방법을 사용해야합니까?


1
아니요-작동하지 않습니다. 그들에게 % 40을 붙이는 것도 작동하지 않습니다.
iZ.

4
@ 문자가 포함되지 않은 암호로 변경하는 것이 좋습니다.
Sylvain Defresne 2011 년

1
슬래시로 이스케이프가 작동합니까? "\ @"?
DhruvPathak 2011 년

1
@AmolMKulkarni : 몽구스가 연결을 지정하는 데 사용하는 형식이라는 것을 알고 있습니다. 하지만 OP는 '@'가 포함 된 암호를 어떻게 사용할 수 있는지 알고 싶었습니까? 이것은 "p @ ssw0rd"와 같은 암호 (불완전한 암호)입니다. URL은 몽구스가 잘못 해석 한 "monbgodb : // username : p @ ssw0rd @ host : port / db"입니다 (즉, 마지막 대신 첫 번째 @에서 분할 됨).
Sylvain Defresne 2013 년

1
@비밀번호 의 문자 는 URL에 인코딩되어야합니다. 인코딩 된 @문자는 %40입니다. 그러나 %문자도 인코딩해야합니다. 따라서 암호가 인 경우 p@ss최종 인코딩 된 암호는 다음과 같아야합니다p%2540ss
Michael Pacheco 19

답변:


117

다음 구문을 사용하십시오.

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

    }
);

6
이 대답은 더 많은 사랑을 얻을 것입니다. 실제로 @ 기호를 % 40으로 변환하여 트릭을 수행합니다.
jonezy 2015-06-29

4
나는 {uri_decode_auth: true}언뜻보기에 놓쳤지만 그것을 알게되면 작동했습니다. 감사.
Mark Rendle

1
누비의 {uri_decode_auth: true}경우 NodeJS에 있고 mongoDB의 기본 드라이버를 사용하는 경우 별도의 객체로 전달되어야합니다.
Koushik Shom Choudhury

5
[uri_decode_auth] 옵션은 드라이버 버전 3.1
toadead

그것은 [uri_decode_auth]는 몽구스 최신 사용, 지원되지 않는 옵션을 제공합니다
모힛 세 흐갈을

38

비밀번호에 특수 문자가있는 경우 :

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

이것은 OP의 매우 구체적인 사용 사례뿐만 아니라 완전한 문제를 해결함에 따라 더 많은 사랑을 받아야 할 대답입니다.
spikyjt

29

URL 문자열에 비밀번호를 포함하는 대신 호출 의 options매개 변수 mongoose.connect를 사용하여 비밀번호를 지정하십시오.

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내 db 이름
admin은 내 인증 용 db
viettd는 내 사용자 이름
abc@123은 내 암호


5

대신 pwd를 사용하여 버전 3.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가 필요합니다. 자세한 내용 은 useNewUrlParser를 true로 설정하여 "현재 URL 문자열 구문 분석기가 사용되지 않음"경고 방지를 확인 하십시오.

경고를 제거하는 것이지만 버전은 필수 매개 변수에도 영향을줍니다.

모든 특수 문자를 테스트하지는 않았지만 확실히 '@ # $'와 함께 작동합니다.

도움이 되었기를 바랍니다.


1

문자열 만 연결 문자열로 받아들이는 다른 도구 를 사용하여 DB에 연결해야하는 경우가 있습니다 . 따라서 @ 기호를 % 40으로 변경하십시오.


예를 들어 (더미 사용자를 걱정하지 말고 통과하십시오) 다음을 변경하십시오 : mongodb : // kipkip : Nolalola22 @@ ds031223.mlab.com : 3d223 / mishlo to : 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)

이 제안은 mongooseGitHub 문제 # 6044 에서 찾았습니다 .


0

Mongo Compass로 연결하는 경우 ( MacOSx ) mongodb.com에서 클러스터 -> 보안 (Tab)으로 이동하면 됩니다.

클러스터 보안

그때

비밀번호 수정 (사용자 이름의 수정 버튼 누르기) : 여기에 이미지 설명 입력

모달 / 팝업 / 대화 상자가 표시됩니다 : 이름 아래에있는 비밀번호 편집을 누르십시오 (버튼은 기본적으로 회색으로 표시되지만 이름 바로 아래에 나타납니다)-> 그런 다음 사용자 업데이트를 누르 십시오.

대화 상자 팝업의 EditPassword

다음 :

실행중인 경우 mongo db 나침반 응용 프로그램을 닫습니다. (Mongo 종료)

Mongo Compass 종료

다음 단계:

mongodb.com.의 개요 탭으로 돌아가 연결을 선택 합니다.

OverView로 돌아 가기 : 개요로 돌아가서 연결을 선택하십시오.

다음 단계:

팝업 대화 상자에서 Connect with MongoDB Compass를 선택한 다음 다음보기에서 사용할 버전을 선택합니다 (바람직하게는 VersionNumber previous ). MongoDB Compass와 연결

버전 선택

그때:

제공된 URI 문자열을 복사 하십시오 .

Uri 문자열 복사

MongoDB Compass 애플리케이션을 다시 엽니 다.

그리고 그것은 당신에게 옵션을 /를 URI 문자열을 사용하는 팝업 감지를 줄 것이다 : 클릭 URI 문자열 감지

마지막 단계:

새 암호를 입력하고 연결합니다 . 이제 연결이 성공할 것입니다.새 비밀번호를 입력하고 연결


0

이것을 사용하십시오.

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


0

나는 이것을 파이썬에서 시도하고 있었고 비슷한 오류가 발생했습니다. 이것은 나를 위해 일했습니다.

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는 암호를 나타내며 특수 문자 (예 : @-% 40으로 표시)가 있다고 가정합니다.-username은 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.