node.js で WSL Ubuntu20.04 から ActiveDirectory に対して LDAP 認証する

Webアプリ開発

環境

  • OS: Windows 10 Pro
  • WSL2
    • ディストリビューション: Ubuntu20.04
  • Ubuntu には node.js や npm などはインストール済み

やること

WLS 内の Ubuntu から、物理的に別サーバーで立てている Windows の ActiveDirectory に対して LDAP 認証をしてみます。

具体的に、Ubuntu から node.js を使用して LDAP 認証を試してみます。

手順

1. とりあえず LDAP 認証をしてみる

ググり方が悪いのか、なかなか参考になる情報が見つからなかったのですが、↓が見つかり非常に参考になりした。

https://learntutorials.net/ja/node-js/topic/10612/node-jsでのwindows認証

# ベースとなる node のプロジェクトを作る
$ mkdir ldap_test
$ cd ldap_test
$ npm init

# AD へアクセスするためのモジュールをインストール
$ npm install --save activedirectory

# サンプルソースを書く
$ touch index.js

ここで、上記サイト様の抜粋になりますが、 index.js には以下のようにサンプルソースを書きます。

// Initialize
var ActiveDirectory = require('activedirectory');
var config = {
  url: 'ldap://hoge.com', // ADのホスト名
  baseDN: 'dc=hoge,dc=com'    // ホスト名を「.」で分割したもの。多分なくても大丈夫
};
var ad = new ActiveDirectory(config);
var username = 'tonnura@hoge.com';    // ユーザー名
var password = 'xxxxxxx';     // パスワード

// Authenticate
ad.authenticate(username, password, function (err, auth) {
  if (err) {
    console.log('ERROR: ' + JSON.stringify(err));
    return;
  }
  if (auth) {
    console.log('Authenticated!');
  }
  else {
    console.log('Authentication failed!');
  }
});

実行してみると、以下のようになり成功しました。

$ node index.js
Authenticated!

2.LDAP サーバーから個人情報を取得する

上記の続きとなりますが、今度は認証だけでなく、名前や所属情報などの個人情報も取得します。

↓も参考にしました。
https://www.npmjs.com/package/activedirectory

// Initialize
var ActiveDirectory = require('activedirectory');
var username = 'tonnura@hoge.com';    // ユーザー名
var password = 'xxxxxxx';     // パスワード
var config = {
  url: 'ldap://hoge.com', // ADのホスト名
  baseDN: 'dc=hoge,dc=com',   // ホスト名を「.」で分割したもの。多分なくても大丈夫
  username: username,   // ★ config にあらかじめユーザー名を追加
  password: password,   // ★ config にあらかじめパスワードを追加
};

// Authenticate
var ad = new ActiveDirectory(config);   // 引数にユーザー名とパスワードが負荷されているので、ここで認証処理も実施される
console.log('Authenticated!');

// Get
ad.getGroupMembershipForUser(username, function (err, groups) { // またユーザー名を引数に渡すのは冗長なのですが、こういう仕様っぽいです・・・
  if (err) {
    console.log('ERROR: ' + JSON.stringify(err));
    return;
  }
  if (!groups) console.log('User: ' + sAMAccountName + ' not found.');
  else console.log(JSON.stringify(groups));
});

実行してみると、以下のようになり成功しました。

$ node index.js
Authenticated!
[{"dn":"CN=xxxx,OU=xxxx,DC=xxxx,DC=xxxx","cn":"xxxx"},{"dn":"CN=xxxx,OU=xxxx,DC=xxxx,DC=xxxx","cn":"xxxx"}]

ここで重要なのが、new ActiveDirectory(config) 実行時に既にユーザー名とパスワードを設定しておくことです。
こうしないと以下のようなエラーが出ました。

ERROR: {"lde_message":"000004DC: LdapErr: DSID-0C090A59, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v4563\u0000","lde_dn":null}

コメント

タイトルとURLをコピーしました