use*_*903 8 node.js express angularjs
我无法使用标题中提到的工具/应用程序对Active Directory服务器进行身份验证.
我正在使用此处找到的测试AD环境 以下是相关的代码片段,如果有人有任何建议我会非常感激.
目前,我得到的错误是"无效的用户名/密码".我不确定这是bindDn帐户/ pw还是用户在表单中输入的帐号.根据护照-ldapauth项目,它是:
invalidCredentials flash message for InvalidCredentialsError
NoSuchObjectError, and
/no such user/i LDAP errors (default: 'Invalid username/password')
Run Code Online (Sandbox Code Playgroud)
提前致谢.
客户端 - auth.service.js
...
login: function(user, callback) {
var cb = callback || angular.noop;
var deferred = $q.defer();
$http.post('/auth/ldap', {
email: user.email,
password: user.password
}).
success(function(data) {
$cookieStore.put('token', data.token);
currentUser = User.get();
deferred.resolve(data);
return cb();
}).
error(function(err) {
this.logout();
deferred.reject(err);
return cb(err);
}.bind(this));
return deferred.promise;
},
...
Run Code Online (Sandbox Code Playgroud)
SERVER index.js
'use strict';
var express = require('express');
var passport = require('passport');
var auth = require('../auth.service');
var router = express.Router();
router.post('/', function(req, res, next) {
passport.authenticate('ldapauth', function (err, user, info) {
var error = err || info;
if (error) return res.json(401, error);
if (!user) return res.json(404, {message: 'Something went wrong, please try again.'});
var token = auth.signToken(user._id, user.role);
res.json({token: token});
})(req, res, next)
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
SERVER passport.js
var passport = require('passport');
var LdapStrategy = require('passport-ldapauth').Strategy;
exports.setup = function (User, config) {
passport.use(new LdapStrategy({
usernameField: 'email',
passwordField: 'password',
server: {
url: 'ldap://ldap.forumsys.com:389',
bindDn: "cn=read-only-admin,dc=example,dc=com",
bindCredentials: "password",
searchBase: 'ou=mathematicians,dc=example,dc=com',
searchFilter: 'uid={{username}}'
}
},
function (user, done) {
return done(null, user);
}
));
};
Run Code Online (Sandbox Code Playgroud)
问题出ou=mathematicians在搜索库中。该网页上的注释中有以下提及:
您看到的问题是由于“ uid = riemann”是“ ou = mathematicians”的成员,而不是位于该ou下的事实。他在ou中的成员身份由“ ou =数学家”上的uniqueMember属性建立。
这应该工作(甚至尝试过ldapauth-fork哪些passport-ldapauth用途):
var opts = {
server: {
"url": "ldap://ldap.forumsys.com:389",
"adminDn": "cn=read-only-admin,dc=example,dc=com",
"adminPassword": "password",
"searchBase": "dc=example,dc=com",
"searchFilter": "(uid={{username}})",
}
};
Run Code Online (Sandbox Code Playgroud)
您的代码看起来正确,但您遇到的错误让我相信您确实没有提供正确的用户名/密码!您确定使用正确的凭据进行测试吗?
作为旁注——如果您正在寻找一种更简单的方法来为一个大项目做到这一点,并且不介意花一些钱,Stormpath 的 API 服务可以为您做这样的事情:它基本上同步您的 AD / LDAP 用户进入它的 API 服务,这样您就可以通过 REST API 使用它们(这要简单得多)。
您可以使用两个库来使用它:
两者都非常简单/很好用。