如何验证给定密码是否与arangoDB中集合_users
的密码匹配?
我知道可以用Foxx app和arangosh完成,但我没有使用它们,因为我在python中使用自己的API。因此,我不知道如何访问密码并检查是否与给定密码匹配而不使用Foxx或arangosh。
答案 0 :(得分:2)
您不应该依赖系统_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级别授权,而不是用于应用程序逻辑。
答案 1 :(得分:1)
最简单的方法是简单地尝试一个平面的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。