89

The following is my MongoDB connection dial from GoLang. But it's returning a panic "server returned error on SASL authentication step: Authentication failed.". My username, password, hostAddrs and dbName are correct. What am I missing here?

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)

}
Sunil Garg
  • 14,608
  • 25
  • 132
  • 189
Arjun Ajith
  • 1,850
  • 5
  • 21
  • 46

10 Answers10

203

I faced similar error and added --authenticationDatabase parameter and it worked while we connecting to a remote MongoDB

Use the similar below format in your code :

$mongorestore --host databasehost:98761 --username restoreuser
--password restorepwd --authenticationDatabase admin --db targetdb ./path/to/dump/
Serg Chernata
  • 12,280
  • 6
  • 32
  • 50
Anantha
  • 2,156
  • 1
  • 12
  • 5
  • 1
    Thanks, in my case that was exactly the solution. – Rav Jun 27 '17 at 11:44
  • 2
    I'm confused... what is the --authenticationDatabase parameter? the name of the database you want to access? – vabm Jan 20 '18 at 12:02
  • 1
    In my case I had access to only one db on server. So I needed to just add `-d ` option. No need of `--authenticationDatabase` for me – alaster Feb 04 '18 at 17:15
  • It is the right advice, but I had '%' sign in my password, and in the cmd.exe script the sign has disappeared. I had the same error =) – Pax Beach Apr 23 '18 at 06:47
  • I had a ';' in my password! – Bruno Fernandes Sep 27 '18 at 11:03
  • Thanks this was the solution after searching a while for what was wrong. – tyleax Apr 30 '19 at 21:24
  • changing few things and it's working thank you so much bhai – Jigar Prajapati Nov 15 '19 at 13:12
  • My problem was using shorthands `-u` and `-p` even beside `--authenticationDatabase` in `mongoimport`. Replacing them with their long-form respectively ( `--username` and `--password`) along with the `--authenticationDatabase` solved the problem. – DummyBeginner Aug 15 '20 at 18:34
16

Often we confused with parameter in the mongoexport command with "Log-In" user. The command expects "Database Username" not Log-in username. This is one possibility to input wrong user name. "Database Username" can be found in "Users" tab for a database

Geomy George
  • 169
  • 1
  • 3
  • 2
    In my case, I was using my mLab password instead of the db password. Silly mistake but this answer helped me figure it out! – ahaurat Jan 07 '18 at 19:03
10

I got my answer from this link: https://newbiedba.wordpress.com/2016/11/21/mongodb-3-2-server-returned-error-on-sasl-authentication-step-authentication-failed/

Except for all answers above, the only unmentioned reason is that my password has a special character '$' in it. I think this is a very common practice to have special characters and this may trip many without this simple tip:

When using command line mongo/mongostat/etc.. Single quote your username or password that has special characters!

Michael Shang
  • 686
  • 8
  • 9
4

mgo returns this error if username, password or database are wrong. Check your credentials twice. There are no other situations when you can see Authentication failed error message.

CrazyCrow
  • 4,125
  • 1
  • 28
  • 39
  • server returned error on SASL authentication step: Authentication failed. panic: runtime error: invalid memory address or nil pointer dereference panic: runtime error: invalid memory address or nil pointer dereference – Arjun Ajith Aug 03 '16 at 13:12
  • 1
    Yes this is correct way to implement connection. Here is working code https://gist.github.com/bearburger/718dec31746762684a7a512aed992a37 that connects demo DB. – CrazyCrow Aug 03 '16 at 13:18
3

In my case specifying auth database and auth mechanism in uri did help

./mongoimport --uri="mongodb://root:root@localhost:27017/labelDb?authSource=admin&authMechanism=SCRAM-SHA-1" --collection=repo_item --file=/tmp/repo_item.json
Georgy Gobozov
  • 13,633
  • 8
  • 72
  • 78
1

The error you report seem the cause of the authentication fail is caused by a nil pointer, you should check the data before using them to create the connection

Bestbug
  • 475
  • 4
  • 13
  • 2
    I dont know how the up-voter understood you, but I am sure I understood nothing from your answer. Mind elaborating more...? – rrw Feb 27 '18 at 07:00
  • Well after more than 1 year I don't know exactly what I was thinking. Probably my idea was the Golang application can't retreive one or more env_variable from the host. – Bestbug Feb 28 '18 at 08:33
1

I got this error while using a connection string from a Heroku app by means of the --uri flag. What solved it in my case was adding the database name with -d:

mongodb_uri="$(heroku config:get MONGODB_URI -a myapp)"
mongorestore --uri=$mongodb_uri -d heroku_7m41q4xs db/
e18r
  • 7,578
  • 4
  • 45
  • 40
0

I had the same error when using with dokku mongo:import . In my case I included dot(period) in my db name

You shouldn't include dot in your mongodb name when 'dokku mongo:create ' I've changed it to seunghunlee instead of seunghunlee.net now this command works

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

Hope it helps!

0

In my case, I was missing both --authenticationDatabase & --ssl, so here goes the full syntax for importing a json file into a Mongodb collection over an Atlas cluster (into the primary shard):

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

If you are trying to connect your MongoDB Atlas to the Golang Application, the Connection function would be like this:

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
}
Avik
  • 371
  • 4
  • 15