subir - Implementación de MongoDB SASL Autenticación en cl-mongo
probar conexion a mongodb (0)
He bifurcado el repositorio cl-mongo (biblioteca común Lisgo MongoDB) de los fons, ya que se ha caído de mantenimiento y no es compatible con el proceso de inicio de sesión SCRAM-SHA-1. Este es mi fork: https://github.com/mprelude/cl-mongo - los principales cambios están agregando una dependencia en cl-scram (mi implementación de SCRAM) y agregando un contenedor genérico bson bson.
Todavía estoy tratando de enviar el mensaje inicial, por lo que el problema no es que la contraseña sea incorrecta, ya que aún no se utiliza.
¿Por qué esta parte de la autenticación está fallando? ¿Alguien puede confirmar si el BINARY-MESSAGE es lo que debería enviar si deseo transmitir lo que está en el MENSAJE a mongo?
Esta es mi llamada, con algunos resultados de depuración añadidos:
* (asdf:load-system :cl-mongo)
T
* (cl-mongo:db.use "test")
"test"
* (cl-mongo:db.auth "aurumrw" "pencil" :mechanism :SCRAM-SHA-1)
(kv-container : #(#S(CL-MONGO::PAIR :KEY saslStart :VALUE 1)
#S(CL-MONGO::PAIR :KEY mechanism :VALUE SCRAM-SHA-1)
#S(CL-MONGO::PAIR
:KEY payload
:VALUE [CL-MONGO::BSON-BINARY-GENERIC] [binary data of type 0] ))
((CL-MONGO::BINARY-MESSAGE
. #(98 105 119 115 98 106 49 104 100 88 74 49 98 88 74 51 76 72 73 57 83 87
116 122 101 84 100 78 101 71 100 97 90 71 52 53 85 69 86 113 87 108 104
85 89 108 78 75 89 106 74 80 79 87 78 84 99 49 108 84 82 68 99 61))
(CL-MONGO::MESSAGE . "n,,n=aurumrw,r=Iksy7MxgZdn9PEjZXTbSJb2O9cSsYSD7")
(CL-MONGO::CODE . 18) (CL-MONGO::OK . 0.0d0)
(CL-MONGO::ERRMSG . "Authentication failed.")))
Cabe destacar que creo que Mongo debe leer mi solicitud correctamente ya que el mensaje es "Autenticación fallida" (código de error 18), lo que sugiere que entiende que he solicitado una conversación SASL.
Creo que los problemas que estoy teniendo se basan en la carga útil, ya sea el contenido (mensaje inicial de base64, como octetos) o el formato.
Basándome en la documentación de MongoDB y en la forma en que funcionó la discusión original, esta es mi función db.auth reescrita:
(defmethod db.auth ((username string) (password string) &key (mongo (mongo)) (mechanism :SCRAM-SHA-1))
(cond ((equal mechanism :SCRAM-SHA-1)
;; SCRAM-SHA-1 Login
(let* ((nonce (cl-scram:gen-client-nonce))
(pwd (concatenate ''string username ":mongo:" password))
(md5-pwd (hex-md5 pwd))
(md5-pwd-str (ironclad:byte-array-to-hex-string md5-pwd))
(initial-message (cl-scram:gen-client-initial-message :username username
:nonce nonce))
(request (kv (kv "saslStart" 1)
(kv "mechanism" "SCRAM-SHA-1")
(kv "payload"
(bson-binary :generic (ironclad:ascii-string-to-byte-array
(cl-scram:base64-encode initial-message))))))
(response (car (docs (db.find "$cmd" request :limit 1 :mongo mongo))))
(retval (pairlis ''(errmsg ok code message binary-message)
(list (get-element "errmsg" response)
(get-element "ok" response)
(get-element "code" response)
initial-message
(ironclad:ascii-string-to-byte-array (cl-scram:base64-encode initial-message))))))
(list request retval)))
((equal mechanism :MONGODB-CR)
;; MONGODB-CR Login.
(let* ((nonce (get-element "nonce" (car (docs (db.run-command ''getnonce :mongo mongo)))))
(pwd (concatenate ''string username ":mongo:" password))
(md5-pwd (hex-md5 pwd))
(md5-pwd-str (ironclad:byte-array-to-hex-string md5-pwd))
(md5-key (hex-md5 (concatenate ''string nonce username md5-pwd-str)))
(md5-key-str (ironclad:byte-array-to-hex-string md5-key))
(request (kv (kv "authenticate" 1)
(kv "user" username)
(kv "nonce" nonce)
(kv "key" md5-key-str)))
(retval (get-element "ok" (car (docs (db.find "$cmd" request :limit 1 :mongo mongo))))))
(if retval t nil)))
(t nil)))