Estoy usando la versión 4.2.13 de la comunidad mongodb y voy a la versión 1.5 del controlador.
Mi aplicación go se ejecuta en el mismo host que db, pero aparece el siguiente error al intentar establecer una conexión:
connection() error occured during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.Así es como creé la cuenta de administrador:
use admin db.createUser({ user: "admin1", pwd: "passwd12#$", roles: ["root"], mechanisms: ["SCRAM-SHA-256"] }) db.system.users.update( { _id: "admin.admin1", "db": "admin" }, { $addToSet: { authenticationRestrictions: { clientSource: ["127.0.0.1"] } } } )Ir al fragmento de código de la aplicación
package main import ( "context" "fmt" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { uri := fmt.Sprintf( "mongodb://%s:%s@%s:%d/admin?authSource=admin&authMechanism=SCRAM-SHA-256", "admin1", "passwd12#$", "127.0.0.1", 27017, ) // Prints "mongodb://admin1:passwd12#$@127.0.0.1:27017/admin?authSource=admin&authMechanism=SCRAM-SHA-256" fmt.Println(uri) ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second) defer cancel() client, err := mongo.Connect( ctx, options.Client().ApplyURI(uri), ) if err != nil { panic(err) } defer func() { err = client.Disconnect(ctx) if err != nil { panic(err) } }() err = client.Ping(ctx, nil) if err != nil { panic(err) } fmt.Println("pinged") }Intenté lo siguiente, pero todos ellos no funcionaron:
url.QueryEscapeComo nota al margen, conectándose al shell de Mongo con exactamente el mismo uri, y funcionó.
Agregue ssl=false a su uri. Trabajó para mi
Puede intentar usar 'options.Credential' para pasar la configuración de autenticación.
Parece una forma más limpia que formatear un URI que debe analizarse más adelante.
https://docs.mongodb.com/drivers/go/current/fundamentals/auth/
clientOpts := options.Client().SetHosts( []string{"localhost:27017"}, ).SetAuth( options.Credential{ AuthSource: "<authenticationDb>", AuthMechanism: "SCRAM-SHA-256", Username: "<username>", Password: "<password>", } ) client, err := mongo.Connect(context.TODO(), clientOpts)Según la documentación de MongoDB para el proceso de autenticación, hay un parámetro para identificar qué base de datos se usa para la autenticación además de la base de datos de destino en el URI.
Mientras estás en mongoshell puedes usar esta línea
mongo "mongodb://Admin:${DBPASSWORD}@<host>:<port>/admin?authSource=admin" Usé esa información para agregar ?authSource=admin a mi CONNECTION_URL
CONNECTION_URL=mongodb://root:example@mongo:27017/my_database?retryWrites=true&w=majority&authSource=adminEso funcionó para mí. Espero que lo haga por ti también.
Para obtener información detallada, consulte https://www.mongodb.com/features/mongodb-authentication