【问题标题】:Error Message: MongoError: bad auth Authentication failed through URI string错误消息:MongoError: bad auth Authentication failed through URI string
【发布时间】:2019-09-05 19:29:49
【问题描述】:

我正在尝试通过 mongo 给我的连接字符串连接到我的 mongoDB 服务器:

"mongodb+srv://david:password@cluster0-re3gq.mongodb.net/test?retryWrites=true"

在我的代码中,我像这样通过猫鼬调用连接(显然输入了我的密码):

const mongoose = require('mongoose');
const db = 'mongodb+srv://david:<password>@cluster0-re3gq.mongodb.net/test?retryWrites=true'
mongoose
    .connect(db, { 
        useNewUrlParser: true,
        useCreateIndex: true
      })
    .then(() => console.log('MongoDB connected...'))
    .catch(err => console.log(err));

当我运行代码时出现以下错误

“MongoError: bad auth 身份验证失败。”

你有什么想法吗?

【问题讨论】:

  • 我猜它应该在 cluster0 后面加一个点而不是破折号 "mongodb+srv://david:password@cluster0.re3gq.mongodb.net/test?retryWrites=true"

标签: node.js mongodb mongoose


【解决方案1】:

如果您遇到此问题并通过官方 mongo 培训学习 mongo,请使用 m001-mongodb-basics 作为您的数据库的密码。正确的数据库名称是 Sandbox(如果您按照所有步骤操作)

【讨论】:

    【解决方案2】:

    只需转到“MongoDB 用户选项卡”即可找到用户列表。单击编辑,您可以在其中重置密码。有时重置密码可以解决问题。

    【讨论】:

      【解决方案3】:

      就我而言,左右字符都在那里

      像这样:

      <Password>
      

      所以改成:

      Password
      

      【讨论】:

        【解决方案4】:

        除了上述答案之外,问题似乎与我输入错误的数据库密码有关,因为我从 Atlas 菜单中读取的当前密码以及 MongoDB Atlas 真正保存为我当前密码的内容失真。

        在选择新密码时使用“复制”按钮时似乎存在“错误”。

        帮助我的是以下几点:

        • 在网络中打开 Atlas
        • 转到“数据库访问”
        • 在数据库用户上单击“编辑”
        • 为身份验证方法选择“密码”
        • 点击“编辑密码”
        • 在密码字段中点击“显示”
        • 点击“自动生成安全密码”
        • 请勿按“复制”按钮进行复制,而是通过鼠标手动选择并通过鼠标右键单击或键盘命令复制文本
        • 点击下方的“更新用户”

        然后: 浏览数据库用户列表,确保没有其他数据库用户拥有与您刚刚生成的密码相同的密码。

        现在使用此连接字符串再次尝试您的用户名/密码组合(省略占位符“$”和“[]”:

        'mongodb+srv://$[username]:$[password]@$[hostlist]/$[database]?retryWrites=true'


        我注意到,当我通过单击然后单击“复制”按钮自动生成新密码时,自动生成的密码被重置为旧密码。因此,我假设新的自动生成密码是正确的,但实际上它是我的旧密码,此外与另一个数据库用户的密码相同。直到我点击密码输入字段上的“显示”,我才明白这一点。

        【讨论】:

          【解决方案5】:

          不要在 URI 中使用凭据,而是这样使用:

          mongoose.connect(mongodb+srv://clusterAnything.mongodb.net/test?retryWrites=true&w=majority, { user: process.env.MONGO_USER, pass: process.env.MONGO_PASSWORD, useNewUrlParser: true, useUnifiedTopology: true })
          

          【讨论】:

          • 奇怪的是,以这种方式传递信用对我不起作用。我不得不使用字符串插值将我的用户名和密码推送到连接字符串中,并将其作为第一个参数传递给connect。不知道为什么...
          • 为我工作。另外我必须添加 {... authSource: admin }
          【解决方案6】:

          这是因为输入的密码错误。因为您输入的是登录密码而不是集群一。

          解决方案 ===> 步骤 1. 从 mongodb atlas 页面的左侧导航单击 Database Access。

          第 2 步。选择您的用户名,然后单击右侧进行编辑。

          第三步,点击修改密码。

          步骤 4. 点击更新用户。

          在更改密码期间,仅按字母顺序保存密码,因为特殊字符需要编码。

          这就是你现在可以连接的全部内容了。

          【讨论】:

          • 很好的答案,对我来说问题是我的密码使用了特殊字符(就像我所有的密码一样)。 Mongo 应该给出更好的错误信息。
          • 我的问题不仅是使用了不正确的密码(我使用的是帐户密码而不是用户密码(如本答案所示)),而且我还使用了“” " 在密码和数据库名称上。谢谢你非常详细的回答。
          • 删除绒毛的编辑are fine。请避免进一步回滚。
          【解决方案7】:

          只需去掉密码两边的尖括号即可。

          错误答案:
          const db = 'mongodb+srv://username:&lt;password&gt;@cluster0-re3gq.mongodb.net/test?retryWrites=true'

          正确答案:
          const db = 'mongodb+srv://username:password@cluster0-re3gq.mongodb.net/test?retryWrites=true'

          【讨论】:

            【解决方案8】:

            在花了将近一个小时弄乱 URI、更改权限和配置等等之后,我发现我收到了这个错误消息,因为我有一个激活的 VPN 连接。关闭 VPN 后,我能够连接。

            因此,如果没有其他方法对您有用,则您的系统中可能存在阻止成功建立连接的问题,mongodb 只是以bad auth 响应

            【讨论】:

              【解决方案9】:

              这对我有用

                  mongoose.connect(
                  `mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASS}@cluster0.adv0t.mongodb.net/${process.env.MONGO_DATABASE}?retryWrites=true&w=majority`,
                  {
                    useNewUrlParser: true,
                    useUnifiedTopology: true,
                  }
                );
              

              在父目录中创建一个“.env”文件(在此之前需要安装dotenv)(如果选择自定义位置,在server.js/app.js中添加以下内容)。

              require('dotenv').config({ path: '/custom/path/to/.env' }) //uses custom location
              

              否则,在启动服务器的那个 server.js/app.js 中添加这个。

              require('dotenv').config() //uses default location
              

              在“.env”文件中,像这样定义用户、密码和数据库

              MONGO_USER=uSerName
              MONGO_PASS=p@sSW0rd
              MONGO_DATABASE=myDatabase
              

              【讨论】:

                【解决方案10】:

                对我来说,事实证明,我必须在 MongoDB Atlas 页面上的密码字段中跳出标签。在点击“更新用户”之前

                【讨论】:

                  【解决方案11】:

                  mongodb+srv://david:password@cluster0-re3gq.mongodb.net/test?retryWrites=true

                  • 将“password”替换为您为指定用户名注册的密码。
                  • 将 net 后面的“test”替换为您在集合中创建的数据库的名称。

                  【讨论】:

                    【解决方案12】:

                    更改密码对我有用

                    nB:不是地图集密码

                    【讨论】:

                      【解决方案13】:

                      在我的情况下,通过直接设置密码变量解决了上述错误。

                      DATABASE = "test"
                      #PASSWORD = os.environ.get("YOUR_PASSWORD") #This line was causing an error in code
                      PASSWORD = "YOUR_PASSWORD"                  # I added directly password variable
                      
                      client = connect(
                          DATABASE,
                          host=f"mongodb+srv://mano:{PASSWORD}@cluster0.e2arj.mongodb.net/?retryWrites=true&w=majority",
                          alias="default",
                      )
                      

                      【讨论】:

                        【解决方案14】:

                        我只是在知道我使用了正确的用户名、密码和 DBname 时遇到了这个问题。

                        我尝试更改db用户的密码以仔细检查,但仍然无效。

                        然后我创建了一个新用户,赋予用户管理员角色,设置密码等,然后使用该新用户和密码(相同的 dbname)进行连接,并且成功了。

                        我不知道到底是什么问题,但希望它可以帮助你们中的一些人节省一些时间:)

                        【讨论】:

                          【解决方案15】:

                          不仅仅是密码

                          检查所有可能是用户或数据库密码的字段。如果您拼错其中任何一个,您将遇到身份验证错误。
                          转到安全性下左侧窗格中的数据库访问:

                          如果使用edit 按钮更改密码。假设您的密码是:P@sW0rd 您可以使用“数据库用户”屏幕中包含的信息来编译 URL:

                          client = MongoClient("mongodb+srv://giac:P@sW0rd@cluster0.wjdtk.mongodb.net/testc?retryWrites=true&w=majority")
                          

                          其他答案并没有说即使您拼错数据库名称也会出现身份验证错误。

                          【讨论】:

                          • 是的,我拼错了数据库名称 :)
                          【解决方案16】:

                          我在生成和复制密码后忘记更新用户,我想知道为什么它不起作用。后来我看到了更新按钮。之前我是看不见的。哈哈。解决了问题。

                          数据库访问 => 编辑用户 => 生成/复制密码 => 更新! 它对我有用。

                          记得确保你已经更新了它。

                          【讨论】:

                            【解决方案17】:

                            您也可以通过从左侧转到数据库访问然后从右侧转到添加新数据库用户来创建新的数据库用户来消除此错误。 现在创建一个新的用户名和密码,单击确定。现在将这个新的用户名和密码替换到 MongoUri 中。

                            【讨论】:

                              【解决方案18】:

                              我遇到了类似的问题,奇怪的是,当我在数据库访问中创建一个新用户时它得到了解决。这次虽然我点击了自动生成密码。没关系,但就我而言,它解决了这个问题。

                              【讨论】:

                              • 是的,我也一样。他们必须在身份验证层阻止“易于回答”的密码。自动生成密码也对我有用 +1
                              【解决方案19】:

                              最后,对我来说,使用 NodeJs 版本(2.2.12 或更高版本)集群 url 级别较低的连接字符串对我有用。之后,请确保您必须将 Atlas MongoDB 中的当前 IP 地址列入白名单。它应该在 Atlas MongoDB 的网络访问部分显示为 0.0.0.0/0(包括您当前的 IP 地址)。 Connect to cluster NodeJs version 2.2.12 or later

                              主要问题是我将该连接字符串 url 存储在该部分的常量中。因此,最初,我将该连接字符串值存储在单引号/双引号中,但每次我收到身份验证失败错误,因为它无法解析来自 Atlas mongoDB 的“密码”值。所以我使用 backtick (``) 而不是单/双引号来存储该连接字符串。

                              我通过 NodeJs 应用程序连接 mongoDB Atlas 的示例代码。

                              const DB_USER = 'your username in atlas mongodb';
                              
                              const PASSWORD = encodeURIComponent('your password in atlas mongodb');
                              
                              const url = `mongodb://${DB_USER}:${PASSWORD}@cluster0-shard-00-00.3ytbz.mongodb.net:27017,cluster0-shard-00-01.3ytbz.mongodb.net:27017,cluster0-shard-00-02.3ytbz.mongodb.net:27017/sample-db?ssl=true&replicaSet=atlas-z26ao5-shard-0&authSource=admin&retryWrites=true&w=majority`;
                              
                              mongoose.connect(url,
                                {
                                  useNewUrlParser: true,
                                  useUnifiedTopology: true,
                                  useCreateIndex: true,
                                  useFindAndModify: true
                                })
                                .then(() => {
                                  console.log('Connected to database !!');
                                })
                                .catch((err)=>{
                                  console.log('Connection failed !!'+ err.message);
                                });
                              

                              【讨论】:

                              • 这给了我以下信息:{ MongoNetworkError: failed to connect to server [cluster0-shard-00-02.1jykx.mongodb.net:27017] on first connect [MongoError: bad auth: Authentication failed. ]
                              【解决方案20】:
                              mongodb+srv://jehat123:<password>@jehatarmancdeniz-x2yf7.mongodb.net/question-answer?retryWrites=true&w=majority
                              

                              删除所有密码部分

                              这样使用:

                              mongodb+srv://jehat123:yourpass@jehatarmancdeniz-x2yf7.mongodb.net/question-answer?retryWrites=true&w=majority
                              

                              【讨论】:

                                【解决方案21】:

                                在我的情况下,我的密码错误,为了诊断错误,我一直按照以下步骤操作:

                                我必须尝试通过命令行连接:

                                使用这个命令:mongo "mongodb+srv://cluster0-j8ods.mongodb.net/test" --username :

                                回复又是:2020-04-26T11:48:27.641-0500 E QUERY [js] Error: bad auth Authentication failed。 :

                                然后我将更改我的用户的密码,在我的例子中是 root 用户。就是这样,我被授权了

                                【讨论】:

                                • 是的,所以在我的应用程序中出现了一个身份验证错误(在我的.ev 文件中使用 DB_URL 属性,但是当通过 mongosh 检查时,我运行良好。结果证明这是一个错误在属性文件中指定的密码中。我认为通过 mongo shell 检查是第一步,以确保错误不是像我的情况那样微不足道的错误。
                                【解决方案22】:

                                要遵循的清单:

                                1) 确保您使用的是正确的密码(DB 用户密码,而不是 Mongo 帐户)。

                                2) 输入密码时,确保所有特殊字符都经过 URL 编码(例如:p@ssword 应为 p%40ssword)。

                                3) 如果您不记得数据库用户的密码 - 转到数据库访问(如果您使用的是 Mongo Atlas)-> 选择您的数据库用户 -> 编辑 -> 创建新密码 -> 不要忘记更新点击“更新用户”

                                (!) 安全警告:不要在代码中以纯文本形式写入密码 - 请遵循here 给出的建议。

                                【讨论】:

                                  【解决方案23】:

                                  我遇到的同样的问题是 mongoDB 密码认证失败。

                                  “错误:错误的身份验证失败。”

                                  根据上面 Pawan 的建议,我将 MONGO_URI 链接中的登录密码替换为数据库密码,它可以工作。一定要检查那个。

                                  如果您没有生成生成新的或者如果之前创建的则替换为新的。

                                  【讨论】:

                                    【解决方案24】:

                                    我认为您对 mongodb 帐户密码和用户密码感到困惑。 您应该使用用户密码,而不是帐户密码。 这就是我的案子的原因。

                                    【讨论】:

                                    • 如果我忘记了用户密码,如何找回?
                                    • 我不认为你可以,如果你忘记了就改变它。只要您使用普通帐户登录,您就不需要用户密码来更改密码。我认为出于安全原因,他们不允许您查看它
                                    • 对于主要问题,我输入的用户密码是错误的,所以如果@Harry 给出的答案没有帮助检查您使用的用户密码是否正确,如果您确保您没有在用户登录(不是帐户)中使用您的帐户密码
                                    • 密码需要进行URL编码,以防有特殊字符。例如P@ssw0rd#1 将变为 P%40ssw0rd%231
                                    • 和我一样的问题!!非常感谢。
                                    【解决方案25】:

                                    我遇到了同样的问题,就我而言,答案很简单,只需删除&lt;password&gt; 周围的尖括号“”。我一直在尝试:my_login_id:&lt;my_password&gt;,本来应该是my_login_id:my_password

                                    【讨论】:

                                    • 像魅力一样工作!
                                    • 这也是我的问题,我很傻 :D
                                    【解决方案26】:

                                    您是否在&lt;password&gt; 的位置写入密码?如果您不是,一个好的做法是在您的操作系统上创建一个环境变量并使用 process.env.[your variable] 调用它。例如:

                                    const password = process.env.YOURPASSWORDVARIABLE
                                    const db = 'mongodb+srv://david:'+password+'@cluster0-re3gq.mongodb.net/test?retryWrites=true'
                                    

                                    更好的是,您还可以将整个 url 连接字符串放在一个 env 变量中:

                                    【讨论】:

                                    • 谢谢,我如何将字符串传递给 YOURPASSWORDVARIABLE?
                                    • 您将在操作系统上设置环境变量。您将如何执行此操作将取决于您使用的操作系统,您需要搜索您将如何在您的操作系统上执行此操作。但是现在,要让您的代码运行,只需输入您的实际密码而不是 &lt;password&gt;
                                    • 除了在您的操作系统上创建环境变量之外,还有其他方法可以创建环境变量。我建议您阅读this article
                                    猜你喜欢
                                    • 2020-05-18
                                    • 1970-01-01
                                    • 2015-07-18
                                    • 2019-11-07
                                    • 2015-09-04
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多