У меня есть большая CMS, созданная с Meteor, которая до сих пор использовала basic-auth для входа в систему, поскольку у нас не было более одного редактора.Однако все больше людей начнут работать с ним, поэтому я пытаюсь создать функциональность входа через LDAP, чтобы любой авторизованный сотрудник мог войти в систему со своим именем пользователя / паролем
Я старался изо всех сил, учитывая плохую документацию WebApp.connectHandlers и отсутствие контента, интегрирующего паспорт с Meteor.Я основал свой код входа в LDAP на экспресс-примерах (предполагая, что WebApp.connectHandlers.use () был Метеорским эквивалентом Express 'app.use ())
Часть входа работает, то есть запрашивать и проверять пользователячерез LDAP.
Однако я не могу понять, как идентифицировать вошедшего в систему пользователя, когда он делает Meteor.call ().
В данный момент я имею в виду отправку токена JWT обратноаутентифицированный пользователь, сохраните его в файле cookie или что-то в этом роде, и всякий раз, когда создается Meteor.call (), клиент передает маркер в качестве параметра.Тогда я смогу идентифицировать абонента и, например, сохранить имя пользователя в базе данных как человека, который внес определенное изменение.
Хорошо отметить, что я пытаюсь избежать использования системы учетных записей Meteor в качестве требованиязаключается в использовании LDAP без создания каких-либо дополнительных таблиц (поэтому сложность использования этих нескольких пакетов).
Вот мой код с рабочим входом в систему, но не знаю, как передать токен пользователю.
Возможно, вся моя логика JWT неверна, я был бы признателен за любую помощь / предложения.
var basicAuth = require("basic-auth");
var passport = require("passport");
var bodyParser = require("body-parser");
var LdapStrategy = require("passport-ldapauth");
var jwt = require("jsonwebtoken");
// Example of the real LDAP config
var OPTS = {
server: {
url: "ldap://address:port",
bindDN: "admin",
bindCredentials: "adminPassword",
searchBase: "OU=Users,DC=example,DC=com",
searchFilter: "(&(objectClass=user)(sAMAccountName={{username}}))"
},
credentialsLookup: basicAuth
};
Meteor.startup(() => {
passport.use(new LdapStrategy(OPTS));
WebApp.connectHandlers.use(bodyParser.json());
WebApp.connectHandlers.use(bodyParser.urlencoded({ extended: false }));
WebApp.connectHandlers.use(passport.initialize());
WebApp.connectHandlers.use(
"/",
(req, res, next) => {
// This part before the else is to trigger a basic auth popup to enter username/password
let credentials = basicAuth(req);
if (!credentials) {
res.statusCode = 401;
res.setHeader("WWW-Authenticate", "Basic");
res.end("Access denied");
} else {
passport.authenticate(
"ldapauth",
{
session: false
},
function(err, user, info) {
if (err) {
return next(err);
}
if (user) {
var token = jwt.sign(
{ username: user.sAMAccountName },
"someSecretString"
);
console.log("token", token);
next();
}
}
)(req, res, next);
}
},
function(req, res) {
console.log("debug point#2");
res.send({ status: "ok" });
}
);
}