- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我从 fons fork 了 cl-mongo(通用 lisp MongoDB 库)存储库,因为它已停止维护并且不支持 SCRAM-SHA-1 登录过程。这是我的 fork :https://github.com/mprelude/cl-mongo -- 主要变化是增加了对 cl-scram 的依赖(我的 SCRAM 实现),并添加了一个 bson 二进制通用容器。
我仍在尝试发送初始消息,所以问题不在于密码错误,因为尚未使用。
为什么这部分身份验证失败?如果我希望将 MESSAGE 中的内容传输到 mongo,任何人都可以确认 BINARY-MESSAGE 是否是我应该发送的内容?
这是我的电话,添加了一些调试输出:
* (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 documentation 上绘图,以及原始讨论的工作方式,这是我重写的 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)))
最佳答案
检查我们连接到 mongo 服务器的客户端的 mongo 版本(mongo --version
)。
我的情况,mongo 服务器是 Mongo4.0.0 版本,但我的客户端是 2.4.9 版本。更新 mongo 版本以更新 mongo cli。
关于mongodb - 在 cl-mongo 中实现 MongoDB SASL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32486579/
我有一个问题 SELECT DISTINCT SQL_CALC_FOUND_ROWS cl.id AS id, cl.column1 AS column1, cl.column2 AS column2
我有一个 CL 编号,我想要该更改列表后提交的所有更改列表的 CL 编号。是否有执行此操作的 perforce 命令? 最佳答案 p4 changes //... @yourchangelistnum
我正在使用安装了 quicklisp 的 clozure cl(版本 1.8-r15286m)在 Windows 7 64 位系统上工作。 我需要一些用于普通 lisp 的 freetype2 绑定(
我有示例“你好,世界!”来自网络的代码,我想在我大学服务器的 GPU 上运行它。当我输入“gcc main.c”时,它会响应: CL/cl.h: No such file or directory 我
我正在尝试在 Android Studio 中构建一个 openCL 程序,但一直遇到以下问题: Android Studio fatal error: CL/cl.h No such file or
我正在开发一个 kiosk gui,它是用 ruby/gtk 编写的,使用的是 ubuntu。我希望能够从 ruby/gtk gui 中重新启动——具体来说,我想让刷管理卡的人选择重新启动机器
我安装的一些 elisp 函数会生成警告: `flet' is an obsolete macro (as of 24.3); use either `cl-flet' or `cl-letf'. 如
我正在尝试成功执行一个来自名为 Sia Coin 的新加密货币的 make 文件。可以在这里找到Sia Coin GPU Miner 。它相对较新,因此有些东西需要更多的手动安装。我在 Ubuntu
我正在尝试在 C++ 的 Visual Studio 2015 中使用 OpenCL 在 Windows 7 上编译一个简单的“hello world”程序。尝试构建时,出现此错误: Cannot o
我正在使用 OpenCL 运行内核基准测试。我知道我可以使用 OpenCL 供应商提供的各种工具(即 ioc64 或 poclcc)离线编译内核。问题是我得到的性能结果我无法用这些工具的程序集、Ope
在 iAP88/86 文档中,移位和循环的时序信息取决于 CL 中的移位计数 (p2-64)。这似乎暗示它在 CL 中循环计数,进行那么多单位移位。 所以我的问题是,在循环/移位完成后,CL 是否仍然
所以我尝试制作这样的布局: 一种方法是使用底部应用栏 Anatomy ,但底部应用栏的问题是它只能在坐标布局中使用。但我想要一个 ListView 或说它上面的任何其他 View ,所以我使用约束布局
我正在尝试通过 Qt Creator 在我的系统上运行“Valar”基准测试应用程序,但在构建代码时出现错误: https://github.com/Frinhard/valar-bench 我输入命
为了解决这个问题,我阅读了本网站提供的所有解决方案,但它仍然存在。 当我在 windows 10 C:\pyopencl-2016.2.1>setup.py install 中的 cmd 中运行此命令
我是 SYCL/OpenCL/GPGPU 的新手。我正在尝试构建和运行常量加法程序的示例代码, #include #include #include #include namespace sy
在大量搜索此问题的解决方案后,我发现尚未针对 Windows 正确记录此特定错误。所以我决定将这个问题连同解决方案一起发布。抱歉,如果我将其发布在错误的部分。我希望这个解决方案能帮助用户解决 PyOp
我是 CMake 的新手,在这里遇到了一些障碍,想知道这个问题是否有“优雅”的解决方案,或者可能只是一个简单的解决方案。 例如,为了设置编译器标志,我正在执行以下操作: target_compile_
我们正在使用带有gmake的VC++ 2015。该编译器如何确定它是Release版本还是Debug版本? cl.exe / nologo / Zc:wchar_t / wd4675 / wd4407
我正在尝试分析C++中OpenCL内核的性能。 我目前使用std::chrono每次在保存任何内容之前保存开始时间,然后再调用cl::finish(),然后保存结束时间。 虽然大多数结果看起来都是准确
我知道一点Scheme(很久以前读过SICP),写了这个程序: (define (prl k m) (define (print-line n) (cond ((> n 0) (displ
我是一名优秀的程序员,十分优秀!