【问题标题】:server returned error on SASL authentication step: Authentication failed服务器在 SASL 身份验证步骤上返回错误:身份验证失败
【发布时间】:2022-03-09 03:37:48
【问题描述】:

以下是我从 GoLang 获得的 MongoDB 连接拨号。但它返回一个恐慌“服务器在 SASL 身份验证步骤返回错误:身份验证失败。”。我的用户名、密码、hostAddrs 和 dbName 是正确的。我在这里错过了什么?

dbName: = os.Getenv("ENV_DBNAME")
userName: = os.Getenv("ENV_DBUSER")
password: = os.Getenv("ENV_DBPASS")
dbHost: = os.Getenv("ENV_DBHOST")
mongoDialInfo: = & mgo.DialInfo {
 Addrs: [] string {
  dbHost
 },
 Database: dbName,
 Username: userName,
 Password: password,
 Timeout: 60 * time.Second,
}
sess, err: = mgo.DialWithInfo(mongoDialInfo)
if (err != nil) {
 panic(err)

}

【问题讨论】:

    标签: mongodb authentication go mgo


    【解决方案1】:

    我遇到了类似的错误并添加了--authenticationDatabase 参数,它在我们连接到远程 MongoDB 时工作

    在您的代码中使用类似的以下格式:

    $mongorestore --host databasehost:98761 --username restoreuser
    --password restorepwd --authenticationDatabase admin --db targetdb ./path/to/dump/
    

    【讨论】:

    • 谢谢,就我而言,这正是解决方案。
    • 我很困惑... --authenticationDatabase 参数是什么?您要访问的数据库的名称?
    • 就我而言,我只能访问服务器上的一个数据库。所以我只需要添加-d <dbname> 选项。我不需要--authenticationDatabase
    • 这是正确的建议,但我的密码中有 '%' 符号,并且在 cmd.exe 脚本中该符号消失了。我有同样的错误=)
    • 我有一个';'在我的密码里!
    【解决方案2】:

    我们经常将 mongoexport 命令中的参数与“登录”用户混淆。 该命令需要“数据库用户名”而不是登录用户名。 这是输入错误用户名的一种可能性。 “数据库用户名”可以在数据库的“用户”选项卡中找到

    【讨论】:

    • 就我而言,我使用的是 mLab 密码而不是 db 密码。愚蠢的错误,但这个答案帮助我弄清楚了!
    【解决方案3】:

    我从这个链接得到了答案:https://newbiedba.wordpress.com/2016/11/21/mongodb-3-2-server-returned-error-on-sasl-authentication-step-authentication-failed/

    除了以上所有答案之外,唯一未提及的原因是我的密码中有一个特殊字符“$”。我认为使用特殊字符是一种非常常见的做法,如果没有这个简单的提示,这可能会让很多人感到困惑:

    当使用命令行 mongo/mongostat/etc.. 单引号包含特殊字符的用户名或密码!

    【讨论】:

    • 正是我的问题。谢谢。
    • tl;dr "要解决这个问题,只需单引号密码字段。"例如-p '密码'
    • 谢谢,我有一个 & 导致问题
    • 你是我的英雄!
    【解决方案4】:

    如果usernamepassworddatabase 错误,mgo 将返回此错误。检查您的凭据两次。没有其他情况可以看到Authentication failed 错误信息。

    【讨论】:

    • 服务器在 SASL 身份验证步骤中返回错误:身份验证失败。恐慌:运行时错误:无效的内存地址或 nil 指针取消引用恐慌:运行时错误:无效的内存地址或 nil 指针取消引用
    • 是的,这是实现连接的正确方法。这是连接演示数据库的工作代码gist.github.com/bearburger/718dec31746762684a7a512aed992a37
    【解决方案5】:

    您报告的错误似乎是验证失败的原因是由nil指针引起的,您应该在使用它们创建连接之前检查数据

    【讨论】:

    • 我不知道投票赞成者如何理解你,但我确信我从你的回答中一无所获。介意详细说明...?
    • 一年多之后,我不知道自己到底在想什么。可能我的想法是 Golang 应用程序无法从主机检索一个或多个 env_variable。
    【解决方案6】:

    我在通过--uri 标志使用 Heroku 应用程序中的连接字符串时收到此错误。在我的情况下解决它的方法是使用 -d 添加数据库名称:

    mongodb_uri="$(heroku config:get MONGODB_URI -a myapp)"
    mongorestore --uri=$mongodb_uri -d heroku_7m41q4xs db/
    

    【讨论】:

      【解决方案7】:

      在我的例子中,在 uri 中指定身份验证数据库和身份验证机制确实有帮助

      ./mongoimport --uri="mongodb://root:root@localhost:27017/labelDb?authSource=admin&authMechanism=SCRAM-SHA-1" --collection=repo_item --file=/tmp/repo_item.json
      

      【讨论】:

        【解决方案8】:

        我在使用 dokku mongo:import 时遇到了同样的错误。就我而言,我在数据库名称中包含点(句点)

        当 'dokku mongo:create' 时,您不应在 mongodb 名称中包含点 我已将其更改为 seunghunlee 而不是 seunghunlee.net 现在这个命令有效

        dokku mongo:import seunghunlee < seunghunlee.net.dump.gz
        

        希望对你有帮助!

        【讨论】:

          【解决方案9】:

          在我的例子中,我缺少 --authenticationDatabase 和 --ssl,所以这里是通过 Atlas 集群(进入主分片)将 json 文件导入 Mongodb 集合的完整语法:

          ./mongoimport --host mycluster-shard-00-02.d0b2r.mongodb.net:27017 --authenticationDatabase admin --username TestUser --db Test --collection Messages --type json --file RAW.json --ssl
          

          【讨论】:

            【解决方案10】:

            如果您尝试将 MongoDB Atlas 连接到 Golang 应用程序,则连接函数将如下所示:

            func getSession() *mgo.Session {
            
                tlsConfig := &tls.Config{}
            
                dialInfo := &mgo.DialInfo{
                    Addrs: []string{<add your MongoDB shards as string array> }
                    Username: "<MongoDB  username>",
                    Password: "<MongoDB  password",
                }
                dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
                    conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
                    return conn, err
                }
            
                session, err := mgo.DialWithInfo(dialInfo)
            
                if err != nil {
                    panic(err)
                } else {
                    fmt.Printf("DB connected")
                }
                return session
            }
            

            【讨论】:

              猜你喜欢
              • 2019-12-17
              • 2016-11-26
              • 2018-06-05
              • 2016-06-08
              • 2017-04-08
              • 2016-08-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多