【问题标题】:MongoDB password with "@" in it带有“@”的MongoDB密码
【发布时间】:2011-11-21 03:29:45
【问题描述】:

我正在尝试使用 Node.js 中的 Mongoose 使用用户名和密码连接到 MongoDB 数据库。所有的文档都说连接字符串应该是这样的

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

但是,密码中包含“@”字符。我怎样才能制作一个猫鼬会理解的连接字符串?我可以转义密码中的“@”还是我必须使用其他连接方法?

【问题讨论】:

  • 不 - 不起作用。给它们加上 %40 也不起作用。
  • 我建议将密码更改为不包含@字符的密码。
  • 用斜线转义有用吗? "\@" ?
  • @AmolMKulkarni:我知道这是猫鼬用来指定连接的格式。但是 OP 想知道他如何使用包含“@”的密码?这是一个类似“p@ssw0rd”的密码(这是一个蹩脚的密码)。 url 将是“monbgodb://username:p@ssw0rd@host:port/db”,这被 mongoose 误解了(即,它在第一个 @ 而不是最后一个处拆分)。
  • 密码中的字符@需要在URL中编码。编码的@ 字符是%40。但是,% 字符也需要编码。所以,如果你的密码是p@ss,那么最终的编码密码应该是p%2540ss

标签: mongodb node.js mongoose


【解决方案1】:

显然我遇到了类似的情况,但除了避免密码中的特殊字符外,我找不到任何解决方法。我尝试了其他特殊字符(^ % &),它们都不适用于 URL 字符串中的密码。但是 MongoDB doc 只说

: / ? # [ ] @

这些字符需要进行百分比编码。

我尝试在我的密码组合中对它们中的大多数进行编码,但它们都不起作用。

【讨论】:

    【解决方案2】:

    使用这个语法:

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

    【讨论】:

    • 这个答案应该得到更多的爱,它实际上只是将@符号转换为 %40 就可以了。
    • 乍一看我错过了{uri_decode_auth: true},但一旦我注意到它就起作用了。谢谢。
    • 对于新手来说,{uri_decode_auth: true} 如果您在 NodeJS 中并使用 mongoDB 的本机驱动程序,则应作为单独的对象传递。
    • 驱动程序版本 3.1 不支持选项 [uri_decode_auth]
    • 它给出了选项 [uri_decode_auth] is not supported, using mongoose latest
    【解决方案3】:

    这个对我有用

    这是 MongoDB 2020 更新 如果您使用的是单独的 env 文件,那么只需添加您的

    mongoose.connect('url',
    {
        useNewUrlParser: true, 
        useUnifiedTopology: true 
    });
    

    【讨论】:

      【解决方案4】:

      我在 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 下的数据库。

      【讨论】:

        【解决方案5】:

        如果用户名或密码包含 at 符号 @、冒号 :、斜线 / 或百分号 % 字符,请使用 percent encoding

        Mongo 文档: https://docs.mongodb.com/manual/reference/connection-string/

        【讨论】:

          【解决方案6】:

          使用这个,

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

          【讨论】:

            【解决方案7】:

            如果您使用 Mongodb 原生 Node.js 驱动程序,这对我来说是 3.1 驱动程序版本。假设您的网址不包含身份验证信息。

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

            或者,如果您想在您的网址中包含身份验证信息,请执行以下操作:

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

            【讨论】:

              【解决方案8】:

              我也遇到了同样的问题。我已经通过将编码密码添加到连接字符串中来解决。而且效果很好。

              (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',

              【讨论】:

              • 不是最好的建议,建议将密码发送给不受信任的来源...
              • 正如@guyarad 所说,您不应该公开您的数据库密码,如果您经常更改密码,则不适合。而这个评论的原因是,你不需要其他软件/网站来做到这一点,encodeURIComponent() 是可以完成这项工作的内置功能。
              【解决方案9】:

              这个解决方案需要额外的依赖,但它最终对我有用。

              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 中找到了这个建议。

              【讨论】:

                【解决方案10】:

                使用mongoose.connect 调用的options 参数指定密码,而不是将其包含在 URL 字符串中:

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

                【讨论】:

                • 我喜欢这种方法,因为多输入一行并没有什么坏处。
                【解决方案11】:

                上面提到的解决方案都不适合我。我进一步研究了它,发现我必须包含 useNewUrlParser 参数。

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

                据我了解,您需要特定版本的 MongoDB 才能使用它。更多详情,请查看Avoid “current URL string parser is deprecated” warning by setting useNewUrlParser to true

                是去掉警告,但显然版本也会影响所需参数。

                我没有测试所有特殊字符,但它绝对适用于“@#$”。

                希望这会有所帮助。

                【讨论】:

                  【解决方案12】:

                  如果您的密码包含特殊字符:

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

                  【讨论】:

                  • 这个答案应该得到更多的爱,因为它解决了完整的问题,而不仅仅是 OP 的非常具体的用例。
                  • 这很好用,如果有人错过了它的信息,你仍然需要在使用 mongoose.connect() 连接时传递 {useNewUrlParser: true} 作为第二个参数
                  • 这确实应该是公认的答案,因为这解决了根本原因——密码/用户名中的特殊字符需要编码,因为 mongo 连接字符串使用 URI 规范。 RFC2396
                  【解决方案13】:
                  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`
                  );
                  

                  【讨论】:

                    【解决方案14】:

                    有时您需要使用仅接受字符串作为连接字符串的其他tools 连接到数据库。所以只需用 %40 更改 @ 符号

                    【讨论】:

                    • 例如(不要担心虚拟用户并通过)将这个:mongodb://kipkip:Nolalola22@@ds031223.mlab.com:3d223/mishlo 更改为:mongodb://kipkip:Nolalola22%40 @ds031223.mlab.com:3d223/mishlo
                    【解决方案15】:

                    使用 pwd 代替 pass,这对我来说适用于 version3.2

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

                    【讨论】:

                      【解决方案16】:

                      朋友们,试试这个:

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

                      test 是我的数据库名称
                      admin 是我的身份验证数据库
                      viettd 是我的用户名
                      abc@123 是我的密码

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2023-03-24
                        • 2022-11-06
                        • 2010-11-08
                        • 1970-01-01
                        • 2012-07-19
                        • 1970-01-01
                        • 2021-04-20
                        相关资源
                        最近更新 更多