「@」が含まれる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」になりますが、これはmongooseによって誤って解釈されます(つまり、最後の@ではなく最初の@で分割されます)。
Sylvain Defresne 2013年

1
@パスワードの文字はURLにエンコードする必要があります。エンコードされた@文字は%40です。ただし、%文字もエンコードする必要があります。したがって、パスワードが、たとえば、であるp@ss場合、最終的にエンコードされるパスワードは次のようになりますp%2540ss
MichaelPacheco19年

回答:


115

次の構文を使用します。

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

    }
);

6
この答えはもっと愛されるはずです、それは本当にトリックをする%40への@記号に変換するだけです。
jonezy 2015年

4
{uri_decode_auth: true}一見見落としましたが、気づいたらうまくいきました。ありがとう。
マークレンドル2015

1
初心者の{uri_decode_auth: true}場合、NodeJSを使用していて、mongoDBのネイティブドライバーを使用している場合は、別のオブジェクトとして渡す必要があります。
Koushik

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
もう1行入力しても問題がないので、このアプローチが好きです。
S. Patel 2018

5

これを試してみてください、私の友達:

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

test私のデータベース名
adminは認証用のデータベースです
viettdユーザー名
abc@123はパスワードです


5

passの代わりに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から:mongodb:// kipkip:Nolalola22%40@ds031223.mlab.com:3d223 / mishlo
一顧

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のGitHubの問題#6044で見つかりました。


0

Mongo Compassに接続している場合(MacOSxmongodb.comでクラスター->セキュリティ(タブ)に移動するだけです。

クラスター-セキュリティ

次に

パスワードを編集します(ユーザー名の編集ボタンを押します): ここに画像の説明を入力してください

モーダル/ポップアップ/ダイアログが表示されます:名前の下にある編集パスワードを押します(ボタンはデフォルトではグレー表示されていますが、名前のすぐ下に表示されます)->次に[ユーザーの更新]を押します

ダイアログポップアップのEditPassword

次へ

実行中の場合は、mongo db compassアプリケーションを閉じます:(Mongoを終了)

MongoCompassを終了します

次の一歩:

mongodb.comの[概要]タブに戻り、[接続]を選択します

OverViewに戻る: 概要に戻り、接続を選択します

次の一歩:

ポップアップダイアログで[ MongoDBCompassに接続]を選択し、次のビューで使用するバージョン(できれば以前のVersionNumber)を選択します。 MongoDBコンパスに接続する

バージョンを選択

次に:

提示されたURI文字列をコピーします。

URI文字列をコピーする

MongoDBCompassアプリケーションを再度開きます。

そして、検出されたURI文字列を使用するためのオプション/ポップアップが表示されます:[はい]をクリックします URI文字列が検出されました

最終段階:

新しいパスワードを入力して接続します。これで、接続が成功するはずです。新しいパスワードを入力して接続する


0

これを使って、

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


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%40passwordはパスワードを表し、特殊な文字が含まれていることを前提としています(たとえば、@-%40で表されます)-usernameはmongodbユーザー名、ip-ipアドレス、sample_dbは接続したいmongodbの下のデータベースです。


0

これは私のために働いた

これはMongoDB2020アップデート です。別のenvファイルを使用している場合は、

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.