【发布时间】:2016-05-19 13:13:52
【问题描述】:
如何验证给定密码是否与 arangoDB 中 _users 集合中的密码匹配?
我知道这可以通过 Foxx 应用程序和 arangosh 完成,但我没有使用它们,因为我在 python 中使用我自己的 API。所以我不知道如何在不使用 Foxx 或 arangosh 的情况下访问密码并检查是否与给定密码匹配。
【问题讨论】:
如何验证给定密码是否与 arangoDB 中 _users 集合中的密码匹配?
我知道这可以通过 Foxx 应用程序和 arangosh 完成,但我没有使用它们,因为我在 python 中使用我自己的 API。所以我不知道如何在不使用 Foxx 或 arangosh 的情况下访问密码并检查是否与给定密码匹配。
【问题讨论】:
您不应该依赖系统 _users 集合来实现您自己的用户逻辑。该集合严格用于 ArangoDB 自己的用户对象,而不是用于应用程序级用户管理。
如果您确实想使用 ArangoDB 自己的用户管理,那么在禁用身份验证时公开它的最佳方法是使用 ArangoDB 中的 org/arangodb/users 模块(例如使用 Foxx)。该模块提供了一个isValid 方法,该方法接受用户名和密码并返回一个布尔值,指示组合是否有效:
var users = require('org/arangodb/users');
controller.post('/checkpw', function (req, res) {
var credentials = req.params('credentials');
res.json({
valid: users.isValid(
credentials.username,
credentials.password
)
});
})
.bodyParam('credentials', joi.object({
username: joi.string().required(),
password: joi.string().required()
}).required());
用户 HTTP API 当前不公开此方法,因此这是唯一的方法,无需依赖极其不稳定的实现细节(_users 集合的格式在整个 2.x 中发生了变化,集合可能以后再改)。
编辑:当提供有效的用户名和密码时,ArangoDB 3.0 可能会添加一个 API 路由,该路由返回一个令牌(而不是将数据库与会话对象混淆)。这应该更容易与内置用户管理集成,但注意事项保持不变:ArangoDB 用户主要用于 API 级授权,而不是应用程序逻辑。
【讨论】:
最简单的方法是简单地尝试一个简单的 http 请求,然后检查它的结果。最简单的调用是_api/version;我们为数据库添加前缀以查明是否允许用户访问特定数据库。对于这个例子,我们使用_system;您需要将其替换为您要测试身份验证的数据库。
curl --dump - http://Joe:passvoid@localhost:8529/_db/_system/_api/version
GET /_db/_system/_api/version HTTP/1.1
Authorization: Basic Sm9lOnBhc3N2b2lk
User-Agent: curl/7.38.0
Host: localhost:8529
Accept: */*
HTTP/1.1 200 OK
Server: ArangoDB
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Content-Length: 37
{"server":"arango","version":"2.8.8"}
curl --dump - http://Joe:WRONGpassvoid@localhost:8529/_db/_system/_api/version
GET /_db/_system/_api/version HTTP/1.1
Authorization: Basic Sm9lOldST05HcGFzc3ZvaWQ=
User-Agent: curl/7.38.0
Host: localhost:8529
Accept: */*
HTTP/1.1 401 Unauthorized
Server: ArangoDB
Content-Type: text/plain; charset=utf-8
Www-Authenticate: basic realm="arangodb/_system"
Connection: Keep-Alive
Content-Length: 0
所以你需要检查HTTP状态码:200 -> 成功; 401 -> 失败。有关 python 特定 http 处理的详细信息,请参阅howto create authentication headers with python。
【讨论】:
You are about to log in to the site "localhost" with the username "Joe", but the website does not require authentication [...] 访问。我不想激活身份验证,因为用户不直接访问数据库,而是通过应用程序,所以我只想利用 arangodb 附带 _users 集合并使用它。如果无法从_users 获取密码,也许我应该创建自己的用户集合? (但这是我试图避免的)