7

だから私は現在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、または false で応答することです。

これについて詳しく知るための良いリソースを知っている人はいますか?それとも、基本的なクライアント/サーバー側のコードを提案して、次にどこに行くべきかを教えてくれます!

返信をいただければ幸いです。

どうもありがとう

4

1 に答える 1

21

私は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 サーバーを実装しようとしている場合は、サーバーの例に従う必要があります。個人的には、これはやり過ぎであり、セキュリティの面で問題になる可能性があると思います。

于 2013-07-02T05:54:30.993 に答える