Реализация аутентификации MongoDB SASL в cl-mongo

Я разбудил репозиторий cl-mongo (общая библиотека lisp MongoDB) из fons, так как он вышел из строя и не поддерживает процесс входа в систему SCRAM-SHA-1. Это мой форк: https://github.com/mprelude/cl-mongo - основные изменения - добавление зависимости от cl-scram (моя реализация SCRAM) и добавление двоичного универсального контейнера bson.

Я все еще пытаюсь отправить первоначальное сообщение, поэтому проблема не в том, что пароль неправильный, так как он еще не используется.

Почему эта часть аутентификации не работает? Может ли кто-нибудь подтвердить, является ли БИНАРНОЕ СООБЩЕНИЕ тем, что я должен отправлять, если я хочу передать то, что находится в СООБЩЕНИИ, на Монго?

Это мой вызов с некоторыми дополнительными результатами отладки:

* (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.")))

В частности, я думаю, что Mongo, должно быть, правильно читает мой запрос, поскольку сообщение "Проверка подлинности не удалась" (код ошибки 18), что предполагает, что он понимает, что я запросил диалог SASL.

Я полагаю, что проблемы, с которыми я сталкиваюсь, связаны с полезной нагрузкой, либо с содержимым (исходное сообщение base64 в виде октетов), либо с форматом.

Опираясь на документацию MongoDB и то, как работало оригинальное обсуждение, это моя переписанная функция db.auth:

(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)))

0 ответов

Проверьте версию mongo (mongo --version) клиента, с которого мы подключаемся к серверу mongo.

В моем случае сервер mongo имел версию Mongo4.0.0, но мой клиент был версии 2.4.9. Обновите версию mongo, чтобы обновить mongo cli.

Другие вопросы по тегам