Вход в клиент Meteor с использованием LDAP и JWT - PullRequest
0 голосов
/ 13 июня 2018

У меня есть большая 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" });
    }
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...