一尘不染

ldapjs身份验证(用户登录设置)

node.js

因此,我目前正在运行已安装ldapjs的node.js。 我的目标是拥有一个使用ldapjs的系统,以允许用户使用用户名和密码登录。

我已经阅读了一段时间的http://ldapjs.org文档,但是正在努力理解ldap的整个思想以及ldapjs的实现。

我目前在文档中有这个

var ldap = require('ldapjs');

var server = ldap.createServer();

server.bind('cn=root', function(req, res, next) {
  if (req.dn.toString() !== 'cn=root' || req.credentials !== 'secret')
    return next(new ldap.InvalidCredentialsError());

  res.end();
  return next();
});

server.listen(1389, function() {
  console.log('LDAP server up at: %s', server.url);
});

这使我可以运行以下内容并成功绑定到服务器。

ldapsearch -H ldap://localhost:1389 -x -D cn=root -w secret -LLL -b "o=myhost" objectclass=*

但是我真的不确定从这里走到哪里,即使这是正确的方法…

理想的设置是拥有一定范围的用户名和密码,并在成功的ldap连接上确认详细信息正确,并以true(如果用户名/密码不正确)响应。

没有人知道有什么好的资源可以找到更多有关此的信息,或者更好的方法是建议一些基本的客户端/服务器端代码,让我对下一步工作有一个了解!

任何答复将不胜感激。

非常感谢


阅读 982

收藏
2020-07-07

共1个答案

一尘不染

我从未使用过ldapjs,但是根据我刚刚在看似不完整的文档中快速阅读的内容,它可以用于实现LDAP服务器或LDAP客户端,这似乎是您要尝试的操作(即,我正在假设您要针对现有LDAP服务器对应用程序中的用户进行身份验证)。其文档中的大多数示例着重于创建一个侦听特定端口并与后端数据库进行交互的LDAP服务器。如果您不打算在后端数据库或用户和密码存储之间放置基于LDAP的接口,则可能不需要服务器API。如果您已经在运行LDAP服务器,则需要使用其客户端API来执行以下操作:

1.匿名绑定到提供目录服务(包括身份验证服务)的LDAP服务器。看来您可以使用以下方法执行此操作:

var ldap = require('ldapjs');
var client = ldap.createClient({
    url: 'ldap://my.ldap.server'
});

2.通过用户名(例如,电子邮件地址)搜索相应条目的DN

var opts = {
  filter: '(mail=USERNAME)',
  scope: 'sub'
};

client.search('ou=users,o=acme.com', opts, function(err, res) {
  assert.ifError(err);

  res.on('searchEntry', function(entry) {
    console.log('entry: ' + JSON.stringify(entry.object));
  });
  res.on('searchReference', function(referral) {
    console.log('referral: ' + referral.uris.join());
  });
  res.on('error', function(err) {
    console.error('error: ' + err.message);
  });
  res.on('end', function(result) {
    console.log('status: ' + result.status);
  });
});

3.获取返回条目的DN(entry.object)。该库的文档没有过多讨论如何使用这些对象(例如,它们的方法,属性等)。因此,您将必须弄清楚如何实际获取刚刚从目录服务器中检索到的条目的DN或DN的字符串表示形式。[
请参阅此答案下方的评论 ]

4.使用该DN重新绑定到服务器:

client.bind(DN_RETRIEVED, PASSWORD_USER_ENTERED, function(err) {
  assert.ifError(err);
});

5.上面的绑定结果是您需要用来确定验证是否成功的结果。

如果您尝试在用户/密码数据存储区的前面实现LDAP服务器以进行基于LDAP的身份验证,则需要遵循其服务器示例。我个人认为这太过分了,在安全性方面可能会出现问题。

2020-07-07