2017-09-20 17 views
2

LDAP経由で認証できますが、ユーザーが無効なユーザー名/パスワードを入力したときにエラーをキャッチする方法がわかりません。私はfailureRedirectと他のもののセットアップを持っていますが、エラーが発生したときに認証機能でそのステップに到達しません。私は幸運のいずれかでtryキャッチ関数を入れてみました。Passport-activedirectoryを使用してInvalidCredentialsErrorをキャッチできません

は、ここで使用されている認証方式にリンクされている: https://www.npmjs.com/package/passport-activedirectory

前端 -Iも{{failWithErrorの#if}}に{{#ifの誤差を}}変更しようとしています。ユーザーに表示される

{{#if error}} 
    <div class="alert alert-danger"> 
     Warning! {{error}} 
    </div> 
{{/if}} 

**エラーメッセージ**のコードの

InvalidCredentialsError: 80090308: LdapErr: DSID-0C0903C5, comment: AcceptSecurityContext error, data 52e, v2580 
    at messageCallback (d:\........\node_modules\ldapjs\lib\client\client.js:1419:45) 
    at Parser.onMessage (d:\........\node_modules\ldapjs\lib\client\client.js:1089:14) 
    at emitOne (events.js:96:13) 
    at Parser.emit (events.js:188:7) 
    at Parser.write (d:\........\node_modules\ldapjs\lib\messages\parser.js:111:8) 
    at Socket.onData (d:\........\node_modules\ldapjs\lib\client\client.js:1076:22) 
    at emitOne (events.js:96:13) 
    at Socket.emit (events.js:188:7) 
    at readableAddChunk (_stream_readable.js:176:18) 
    at Socket.Readable.push (_stream_readable.js:134:10) 

ブロック.. \ node_modules \ ldapjs \ libに\クライアント\のclient.jsライン1419

if (expect.indexOf(msg.status) === -1) { 
      return sendResult('error', errors.getError(msg)); 
     } 

auth.js

module.exports = function(app,passport) { 

    let opts = { 
     failWithError: true, 
     failureRedirect: '/', 
     successRedirect: '/dashboard', 
     failureFlash: true 
    }; 
    app.post('/login', passport.authenticate('ActiveDirectory', opts), function(req, res) { 
     res.json(req.user); 
    }, function(err) { 
     if (err) res.status(401).send('Not Authenticated'); 
    }); 
}; 

passport.js

module.exports = function(passport) { 
    var ActiveDirectoryStrategy = require('passport-activedirectory'); 

    passport.serializeUser(function (user, done) { done(null, user); }); 
    passport.deserializeUser(function (user, done) { done(null, user); }); 

    passport.use(new ActiveDirectoryStrategy({ 
     integrated: false, 
     passReqToCallback: true, 
     ldap: { 
      url: 'ldap://a.b.awesome:389', 
      baseDN: 'DC=a,DC=b,DC=awesome', 
      bindDN: 'CN=rando user,OU=users,DC=a,DC=b,DC=awesome', 
      bindCredentials: 'ASecret', 
      searchBase: 'OU=users,DC=a,DC=b,DC=awesome', 
      searchFilter: '(sAMAccountName={{username}})', 
      attributes: ['dn', 'displayName', 'givenName', 'sn', 'title', 'userPrincipalName', 'sAMAccountName', 'mail', 'description', 'memberOf'], 
      logging: { 
       name: 'ActiveDirectory', 
       streams: [ 
        { level: 'debug', 
         stream: process.stdout } 
       ] 
      } 
     } 
    }, function (req, profile, ad, done) { 
     ad.isUserMemberOf(profile._json.dn, '123', function (err, isMember) { 
      if (err) return done(err); 
      return done (null, profile) 
     }) 
    })); 

}; 

答えて

1

だから私は、エラー「キャッチ」することができたし、もはやユーザーにエラーメッセージが表示されません。 しかし、エクスプレスハンドルバーで私のカスタムエラーメッセージを表示したくない場合は、間違っている可能性があります。

エラーをキャッチするための答え: https://github.com/bhoriuchi/passport-activedirectory/issues/4

auth.js

app.post('/login', passport.authenticate('ActiveDirectory', opts), function(req, res) { 
     res.json(req.user); 
    }, function(err, req, res, next) { 
     let statusCode = /InvalidCredentialsError/.test(err.stack) 
      ? res.redirect('/') && res.send({error: 'Invalid Credentials!'}) 
      : 500; 
     return res.status(statusCode) 
    }); 

EDIT

私もあることをフロントエンドにデータを送信する方法を考え出しました良い方法で表示されます。

新しいauth.js

app.post('/login', passport.authenticate('ActiveDirectory', opts), function(req, res) { 
     res.json(req.user); 
    }, function(err, req, res, next) { 
     let statusCode = /InvalidCredentialsError/.test(err.stack) 
      ? res.render('login', {failWithError: true, error: 'Invalid Username or Password!'}) 
      : res.status(500); 
     return statusCode 
    }); 

フロントエンド.hbs

{{#if failWithError}} 
    <div class="alert alert-danger"> 
     <strong>Error!</strong> {{error}} 
    </div> 
{{/if}} 
関連する問題