arangodb 验证_users 密码

arangodb verify _users password

如何验证给定密码是否与 arangoDB 中集合 _users 中的密码匹配?

我知道可以使用 Foxx 应用程序和 arangosh 来完成,但我没有使用它们,因为我在 python 中使用我自己的 API。所以我不知道如何在不使用 Foxx 或 arangosh 的情况下访问密码并检查是否与给定的密码匹配。

最简单的方法是简单地尝试一个普通的 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

您不应该依赖系统 _users 集合来实现您自己的用户逻辑。该集合严格用于ArangoDB自己的用户对象,不用于应用程序级用户管理。

如果你真的想使用 ArangoDB 自己的用户管理,最好的方法是在禁用身份验证时使用 ArangoDB 中的 org/arangodb/users 模块(例如使用 Foxx)。该模块提供了一个 isValid 方法,该方法接受用户名和密码以及 returns 一个指示组合是否有效的布尔值:

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 路由,该路由 returns 一个令牌(而不是用会话对象使数据库混乱)。这应该更容易与内置用户管理集成,但注意事项保持不变:ArangoDB 用户主要用于 API 级授权,而不是应用程序逻辑。