【问题标题】:Meteor and MongoDB: Authentication failuresMeteor 和 MongoDB:身份验证失败
【发布时间】:2015-05-06 05:57:56
【问题描述】:

如果我在本地运行 Meteor,它会完美运行。如果我用没有username:passwordMONGO_URL 调用Meteor,它也可以完美运行。但是,如果我打开 MongoDB 身份验证并重新启动,然后使用 username:password 设置运行 Meteor,就像在 MONGO_URL="mongodb://username:password@127.0.0.1:27017/meteor" 中一样,那么当 Meteor 加载时我会遇到身份验证失败。我检查了用户名和密码是否正确。我已经读到 Meteor 和 MongoDB 身份验证可能存在问题,所以有人有这方面的任何信息吗?我正在使用以下版本:

流星 - 1.0.3.2 MongoDB - 2.6.7(通过 brew 安装)

I20150304-21:48:00.597(1)? Exception in callback of async function: MongoError: auth failed
I20150304-21:48:00.598(1)?     at Object.toError (/Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/utils.js:110:11)
I20150304-21:48:00.598(1)?     at /Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1128:31
I20150304-21:48:00.598(1)?     at /Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1843:9
I20150304-21:48:00.598(1)?     at Server.Base._callHandler (/Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/base.js:445:41)
I20150304-21:48:00.598(1)?     at /Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/server.js:468:18
I20150304-21:48:00.598(1)?     at [object Object].MongoReply.parseBody (/Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
I20150304-21:48:00.599(1)?     at [object Object].<anonymous> (/Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/server.js:426:20)
I20150304-21:48:00.599(1)?     at [object Object].emit (events.js:95:17)
I20150304-21:48:00.599(1)?     at [object Object].<anonymous> (/Users/me/.meteor/packages/mongo/.1.0.11.1hg8e3j++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:201:13)
I20150304-21:48:00.599(1)?     at [object Object].emit (events.js:98:17)

================================================ ==

我以为我对上述问题有答案,但可惜没有,我做了建议的更改,但我仍然无法进行身份验证。因此,提供更多详细信息:

  1. 我已经升级到 MonogoDB 3.0.0
  2. 我删除了数据库以便创建一个全新的数据库。
  3. 我的配置文件如下:

     systemLog:
     destination: file
     path: /usr/local/var/log/mongodb/mongo.log
     logAppend: true
     storage:
     dbPath: /usr/local/var/mongodb
     net:
     bindIp: 127.0.0.1
     security:
     authorization: enabled
    
  4. 在“admin”数据库中创建了一个“超级用户”,如下所示:

       use admin
       db.createUser({user: "superuser", pwd: "password", roles:["root"]})use admin
    
  5. 然后我在“meteor”数据库上创建了一个用户

       db.auth("superuser", "password")
       use meteor
       db.createUser({user: "meteor", pwd: "password", roles: [{ role: "readWrite", db: "meteor"}]})
    
  6. 以上步骤生成:

    Successfully added user: {
        "user" : "meteor",
        "roles" : [
            {
                "role" : "readWrite",
                "db" : "meteor"
            }
        ]
    }
    
  7. 如果我执行db.getUsers(),我会收到消息:

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

如果我注释掉配置中的两个安全行,那么我可以毫无问题地从 Meteor 或 RoboMongo 访问 MongoDB - 使用 mongodb:127.0.0.1:27017/meteor。如果我取消注释配置中的两个安全行,那么我将无法再从 Meteor 或 MongoDB 访问 MongoDB - 使用 mongodb://meteor:password@127.0.0.1:27017/meteor。在最后一个实例中,我继续收到身份验证失败的消息。在 MongoDB 日志中,我有:

authenticate db: meteor { authenticate: 1, nonce: "xxx", user: "meteor", key: "xxx" }
2015-03-08T14:34:44.909+0100 I ACCESS   [conn7] Failed to authenticate meteor@meteor with mechanism MONGODB-CR: AuthenticationFailed UserNotFound Could not find user meteor@meteor

更新

下面的答案和上面的配置适用于 v2.6.7

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    结果对我来说只是在密码上有特殊字符,在用户名上有一个破折号,一旦我让它变得更简单,一切都像魔术一样工作:(

    【讨论】:

    • 不喜欢插入符号...即密码中的 ^
    【解决方案2】:

    我在新 VPS 上部署时遇到了同样的问题。 在这个新的 VPS 上,mongo 版本是 3.0.1 为了解决这个问题,在构建包之前进行流星更新,它可以工作 (流星版本:1.0.4.1)

    【讨论】:

      【解决方案3】:

      我没有看到你描述的问题,也没有看到代码或知道你是如何“打开”MongoDB 身份验证的,我需要猜测 - 所以让我们专注于是什么让事情对我有用。

      您应该检查用户的创建位置。在 MongoDB 中有多个数据库,每个数据库都有自己的用户。使用连接字符串时

      mongodb://username:password@127.0.0.1:27017/meteor
      

      您正在针对meteor 数据库进行身份验证。使用 RoboMongo 之类的工具,我会检查用户是否真的在该数据库中,或者您是否在 admin(或任何其他)数据库中创建了它。

      简要说明: 保护 MongoDB 时,您需要设置一个管理员帐户,更改其中包含行 auth = truemongodb.conf 文件并重新启动。然后使用管理员帐户创建一个新的(低权限)数据库用户,该用户只能访问meteor 数据库。您可以使用这样的命令行来执行此操作(2.6 的代码,因为这在您的问题中,并且将是下一个 Meteor 版本的默认设置):

      db.createUser(
        { user: "username",
          pwd: "password",
          roles: [
            { role: "readwrite", db: "meteor" } 
          ]
      })
      

      如果您在与 Meteor 相同的盒子上运行 mongod,我认为我们可以安全地排除 net.portnet.bindIpconfig 设置导致数据库根本不听请求的任何问题。

      如果您完成了所有这些并重新启动了 MongoDB,那么您的项目中的 meteor reset 或许可以帮助解决任何问题。

      【讨论】:

      • 完美。根据您的建议,我选择了 RoboMongo 并用它来创建我的用户。一旦我这样做了,系统就会运行:) 我猜我在 mongo 命令处理器级别创建的位置/内容实际上并没有发生。这就是新手的问题。感谢您的帮助,非常感谢 :)
      • 哦,我以为它已修复,但似乎我仍然有问题...有任何建议或您需要更多信息吗?谢谢:)
      • MongoDB 3 可能太新了。下一个流星 10.0.4 将支持 2.6,除非您想带头进行 3.0 的兼容性测试,否则我建议您暂时使用 2.6。
      • 谢谢,很好的解释!一个小的更正:在您的示例中,Mongo 需要 role readWrite 大写 W
      猜你喜欢
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2022-01-18
      • 2021-04-24
      相关资源
      最近更新 更多