[英]Failed LDAP authentication using passport-ldapauth on Node.js
嗨,我是 openldap 和 nodejs 的新手。 我正在尝试创建 openldap 身份验证并使用简单的节点应用程序针对本地 ldap 服务器测试该身份验证。
我的理解是我可以创建 ldap 服务器并将所有用户添加到 Apache Directory Studio 中。 然后编写一个与 ldap 服务器相同配置的简单节点应用程序。 使用 postman 发送认证请求,应该可以得到授权结果。 如果我错了,请纠正我。
以下是我采取的步骤:
我使用 Apache Directory Studio 在本地设置了 ldap 服务器。
然后我尝试设置一个简单的 nodejs 应用程序(代码如下所示)。
当我使用 Postman 向我之前使用 Apache Directory Studio 设置的某个用户发送身份验证请求时,但我一直收到错误Unauthorized
。
我相信我可以使用 postman 调用来访问节点应用程序,因为我能够使用 Apache Studio 中存在的用户名和密码获得“未经授权”的响应。 But the node app is not working with / hooked up with the Ldap server set up by Apache Directory Studio, because I can change the server fields in the node code to completely different from the ldap server but still able to get the unauthorized response in postman . 我可能对 ldap 服务器没有完全了解,也许节点应用程序和 ldap 服务器是完全分开的? 或者这应该工作它只是我的代码有问题?
下面是我的节点代码。 请帮忙,谢谢。
var express = require('express'),
passport = require('passport'),
bodyParser = require('body-parser'),
LdapStrategy = require('passport-ldapauth'),
basicAuth = require('basic-auth')
var OPTS = {
server: {
url: 'ldap://localhost:10389',
bindDN: 'cn=admin,ou=users,dc=contoso,dc=com',
bindCredentials: 'secret',
searchBase: 'ou=users,dc=contoso,dc=com',
searchFilter: '(cn={{Username}})'
},
credentialsLookup: basicAuth,
usernameField: Username,
passwordField: Password
};
var app = express();
passport.use(new LdapStrategy(OPTS));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(passport.initialize());
app.post('/login', passport.authenticate('ldapauth', {session: false}), function(req, res) {
res.send({status: 'ok'});
});
app.listen(8080);
有 3 件事需要解决(前提是您的凭据正确):
searchBase
使用完整的 dn(不是 rdn)credentialsLookup
,也可以设置usernameField
和passwordField
。例如,使用正确的语法保持相同的用户名属性和搜索库:
searchBase: 'ou=users,dc=contoso,dc=com',
searchFilter: '(cn={{Username}})'
这应该适用于使用以下 dn 模式对用户进行身份验证:
cn=<username>,<searchBase> => cn=foo,ou=users,dc=contoso,dc=com
以上是基于您之前的配置,但如果没有更多详细信息,您仍然无法猜测用户 dn 在您的目录中的样子。 请注意,经理帐户 (bindDN) 和普通用户通常不会共享相同的 dn 模式/结构,并且您的过滤器中的用户名属性cn
可能是错误的。
也就是说,在给定用户条目 dn 字符串的情况下确定 dn 结构是非常明显的,例如,如果用户名属性是uid
并且用户群位于ou=people
下:
dn: uid=foo,ou=people,dc=contoso,dc=com
=> searchBase: 'ou=people,dc=contoso,dc=com'
=> searchFilter: '(uid={{Username}})'
现在,如果您决定通过请求正文传递凭据,则应根据例如设置usernameField
和passwordField
。 使用以下 body { "user": "test", "pass": "test" }
,您可以设置:
//credentialsLookup: basicAuth,
usernameField: user,
passwordField: pass
但是,如果您更喜欢通过授权 header 设置凭据,那么您可以使用带有所需身份验证类型的credentialsLookup
查找,并在 Postman 的“授权”选项卡中进行设置。
请注意,如果您同时设置了credentialsLookup
和其他两个字段,则即使查找失败(没有回退可能),credentialsLookup 也会获胜。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.