2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ldapjsで認証失敗時のハンドリングが結構めんどくさい件

Last updated at Posted at 2018-07-17

失敗の原因判別がつかないのでござる

  • 普通にパスワード間違えた場合
  • パスワードの期限が切れた場合
  • アカウントがロックされた場合

これらの場合はすべて
Invalid Credential(49)

                  ...  (´゚д゚`)ポカーン

有識者に聞いてみたら、一応OpenLDAPの作り的には
それで良くて、細かいメッセージは必須ではないそう

そもそもldapsearchコマンドでも判別がつかない

上記のケースで、ターミナルでldapsearchを叩いても
Invalid Credential(49)
しか出てこない
一方、ldapサーバーにリモートアクセスし、中でコマンド叩くとしっかりメッセージが細かく分かれている

ldapjsのメッセージラッピングがイけてない説を疑っていた自分を悔いつつ、
それじゃあどうしようもないわなと。。。

回避策

要は気合を入れてハンドリングすればいいと。
フローして:

*前処理*
ユーザーが認証失敗した時、
サーバーで一度管理者でbindし、そのユーザー情報をldapjsのsearch関数取得する

if searchで取れるアカウントのパスワードと実際にユーザーが入力したパスワードが一致する {
  if pwdAccountLockedTimeという属性値を取得できたら {
       ユーザーアカウントはロックされているので、その処理を行う
     } 
  else {
    ユーザーパスワードは期限切れなので、その処理を行う
  }
} else {
 入力ミスの処理を行う
}
// 先にロック判定などしたほうがいい気もするが、今回はこの分岐にした

sinippet

promiseしてない、サーセン

// client は ldapjsのインスタンス
// ssha は ssha モジュールのインスタンス

  let opt = { attributes: ['pwdAccountLockedTime', 'userPassword'] };
  client.search(`ユーザー識別子`, opt, (er, response) => {
          response.on('searchEntry', (entry) => {
                 // 一応sshaモジュールのverify関数を使う(ツッコミどころ)
                 if(pwd === entry.object.userPassword || ssha.verify(pwd, entry.object.userPassword)) {
                      if(entry.object.hasOwnProperty('pwdAccountLockedTime')) {
                        console.log('Account locked');
                      } else {
                        console.log('Password expired');
                      }
                    } else {
                       console.log('Invalid Password');
                    }
                    return;
                  });
                  response.on('searchReference', function(referral) {
                        // ...
                  });
                  response.on('error', function(err) {
                        // ...
                  });
                  response.on('end', function(result) {
                        // ...
                  });
                });
他のハンドリングの仕方や ldapについて全くわかっていないため、 もしクライアント側での設定でこの問題が解決できるのであれば、 ぜひご教授いただきたいです。
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?