【问题标题】:Authentication always failing when connecting to MongoDB连接到 MongoDB 时身份验证总是失败
【发布时间】:2015-08-29 14:28:15
【问题描述】:

我正在使用节点/快递 节点模块 = “mongodb”:“2.0.33”, “猫鼬”:“3.8.15”,

mongo shell 版本:3.0 和 mongo 3.0

我可以很好地连接到我的 mongoDB,但是如果我传入任何身份验证参数,它将失败:

connection error: { [MongoError: auth failed] name: 'MongoError', ok: 0, errmsg: 'auth failed', code: 18 }

发生这种情况时,日志中会显示以下内容:

2015-06-13T15:10:09.863-0400 I ACCESS [conn8] authenticate db: mydatabase { authenticate: 1, user: "user", nonce: "xxx", key: "xxx" } 2015-06-13T15:10:09.863-0400 I ACCESS [conn8] Failed to authenticate user@mydatabase with mechanism MONGODB-CR: AuthenticationFailed UserNotFound Could not find user user@mydatabase

我已经做了很多模式来尝试让它发挥作用。

当我在适当的数据库上在 mongo shell 中执行 show users 命令时会发生以下情况:

{
    "_id" : "mydatabase.user",
    "user" : "user",
    "db" : "mydatabase",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "mydatabase"
        }
    ]
}

这是我在传递正确参数的同时连接到这个特定数据库的尝试:

mongoose.connect('mongodb://user:password@host:port/mydatabase');

为了更好的衡量,我还尝试传递选项哈希而不是通过 uri 传递参数:

mongoose.connect('mongodb://host:port/mydatabase',{user: 'user',pass: 'password'});

奇怪的是,这在从 shell 完成时可以工作:

mongo mydatabase -u user -p password

很明显,凭据是正确的,它正在将它们排列到正确的数据库中,但是与 Mongoose 的连接不起作用......

这是我在创建该用户时传入的 shell 命令:

db.createUser({ 
  user: "user",
  pwd: "password",
  roles: [
    { role: "readWrite", db: "mydatabase" }
  ]
});

我收到了一条成功消息,我在使用mydatabase set 时调用了show users 命令确认

我在这里真的不知所措....这是我之前所做的一些尚未让我成功的研究:

Cannot authenticate into mongo, "auth fails"

这个答案表明它不会工作,因为身份验证发生在数据库级别,所以我的 mongo 实例缺少某种配置选项,但是文档现在说默认情况下禁用此类级别身份验证,并且答案链接的文档已被弃用。

MongoDB & Mongoose accessing one database while authenticating against another (NodeJS, Mongoose)

使用仍然有 addUser 的旧版 Mongo 最重要的是,我不明白为什么这样做会起作用,因为它建议我向文档中未列出的“身份验证”选项添加一个参数:
http://mongodb.github.io/node-mongodb-native/api-generated/db.html#authenticate

http://mongoosejs.com/docs/connections.html

基本上我现在正在尝试,但不起作用。

authenticate user with mongoose + express.js

我已经尝试了许多涉及做这种事情的答案,这给了我同样的错误。另外,我宁愿避免这些类型的解决方案,这些解决方案现在需要 +80 行代码来进行身份验证。我只想先完成基本身份验证。

【问题讨论】:

  • 你看服务器上的node/mongo日志了吗?他们说什么?
  • 2015-06-13T15:10:09.863-0400 我访问 [conn8] 验证 db:mydatabase { 验证:1,用户:“用户”,随机数:“xxx”,密钥:“xxx” } 2015-06-13T15:10:09.863-0400 I ACCESS [conn8] 无法使用 MONGODB-CR 机制验证 user@mydatabase:AuthenticationFailed UserNotFound 找不到用户 user@mydatabase
  • 重申一下,在 shell 中键入“使用我的数据库”和“显示用户”将显示我的用户在那里......
  • 所以总结一下:'user'(来自 shell)成功并且 'user@mydatabase'(来自 mongo API)失败并出现 'UserNotFound'?也许这就是问题所在?
  • 我也有同样的问题,这是解释jira.mongodb.org/browse/SERVER-17459

标签: node.js mongodb authentication express


【解决方案1】:

您提到您使用的是 MongoDB 3.0。在 MongoDB 3.0 中,它现在支持多种身份验证机制。

  1. MongoDB 挑战和响应 (SCRAM-SHA-1) - 3.0 中的默认值
  2. MongoDB 挑战和响应 (MONGODB-CR) - 以前的默认值 (

如果您从创建了新用户的新 3.0 数据库开始,他们将使用 SCRAM-SHA-1 创建。

所以你需要一个能够进行身份验证的驱动程序:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

如果您使用现有用户数据从 2.x 升级数据库,他们仍将使用 MONGODB-CR,并且必须升级用户身份验证数据库:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

特定于您的特定环境 Mongoose 对该版本的兼容性似乎不支持 3.0,因为正在使用 MongoDB Node.js 驱动程序(请参阅 Mongoose 网站上的兼容性页面——抱歉,无法发布更多信息目前超过 2 个链接)。

我建议你更新 Mongoose。

【讨论】:

  • 谢谢,这为我解决了一个非常复杂的调试问题。
【解决方案2】:

Mongo v3.0+:

db 字段(在角色对象之外)在这里很重要。通过将其传递给 createUser 命令 afaict 是无法设置的。

设置它的方法是在发出 creatUser 命令之前键入“use”。

除非你这样做,否则角色内部的 db 对象可能具有正确的预期值,但身份验证仍然不起作用。

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 2019-06-22
    • 2018-09-25
    • 2015-07-09
    • 2016-06-23
    • 2016-02-13
    • 2010-09-12
    • 2016-07-05
    相关资源
    最近更新 更多