API-аутентификация микросервисов с помощью API-шлюза в NodeJS / Express - PullRequest
0 голосов
/ 02 сентября 2018

Я создаю микросервисную архитектуру, используя Node JS и Express. Я знаю, что одной из основных функций микросервисов является сервис-ориентированная архитектура, в которой команды могут самостоятельно проектировать, разрабатывать и поставлять свои приложения. Поэтому в моем проекте я считаю, что каждый микросервис предлагает свои API, и они взаимодействуют друг с другом с помощью API, таким образом, каждый микросервис независим и имеет собственную жизнь, ожидающую запроса.

Я пишу этот вопрос, потому что у меня есть несколько сомнений по поводу аутентификация и связь между микросервисами.

Для аутентификации я провел некоторый тест с JWT для аутентификации API микросервиса, и все работает отлично, это пример экспресс-промежуточного программного обеспечения для аутентификации:

const tokenCheck = (req, res, next) => {
  let token = getToken(req);

  if (token) {
    jwt.verify(token, "password, (err, decoded) => {

      if (err) {
        throw "Failed to authenticate token.";
      } else {
        req.user = decoded;
        next();
      }
    });
  } else {
    throw "No token provided.";
  }
};

Используется таким образом:

router.get("/", tokenCheck, Controller.get);

Таким образом, каждый маршрут защищен слоем аутентификации.

Вместо общения между микросервисами я прочитал, что лучше всего использовать API-шлюз, и я нашел для этого эту библиотеку, более того, я прочитал, что лучше добавить промежуточное ПО аутентификации внутри API-шлюза, потому что если вы заново реализуете эти вещи в каждом отдельном микросервисе, вы сначала дублируете код, но, что более важно, у вас есть две разные части программного обеспечения для обслуживания.

Теперь у меня два вопроса:

1) Правильно ли использовать API-шлюз, например , , для установления связи между микросервисами?

2) Если я перенесу промежуточное ПО аутентификации с микросервисов на шлюз API, мне придется удалить промежуточное ПО из маршрутов API, и таким образом API будет незащищенным, если кто-то, кроме шлюза, сделает запросы, и я думаю, что это неправильно, потому что любой может назвать эти маршруты, вместо этого, если я поддерживаю промежуточное программное обеспечение, также является ли mircorservice, если код дублируется, кто-нибудь может сказать мне, как правильно это сделать?

1 Ответ

0 голосов
/ 02 сентября 2018

Я работаю над Node.js последние пару лет, и вот мое понимание, надеюсь, это поможет вам прояснить ваши мысли.

Ответ на ваш вопрос:

Позвольте мне объяснить вам работу обеих частей, которые вы указали в вопросе.

  • http-proxy-middleware

  • Ваше обычное промежуточное ПО

    • Ваше специальное промежуточное программное обеспечение - это код, специфичный для проекта, для проверки подлинности всех запросов.
    • Он будет проверять, есть ли в запросе токен и является ли токен действительным.

Вывод:

  • Вам обязательно нужно ваше специальное промежуточное программное обеспечение. Еще один (http-proxy-middleware ) не является обязательным.

Обновление:

Теперь у меня два вопроса:

1) Правильно ли использовать такой API-шлюз для связи между microservices

Ответ: Нет, это не правильный путь.

2) Если я переместу промежуточное ПО аутентификации с микросервисов на API-шлюз, я должен удалить промежуточное ПО из маршрутов API и таким образом API будет незащищенным, если кто-либо, кроме шлюз делает запросы, и я думаю, что это неправильно, потому что каждый может называть эти маршруты, вместо этого, если я поддерживаю промежуточное программное обеспечение также является mircorservice код продублирован, может кто подскажет что такое правильный способ сделать это?

Для этого вы можете наложить промежуточное ПО аутентификации на приложение , чтобы все маршруты выполняли промежуточное ПО. Обновите код своего сервера.

// Init App
const App = Express();
// Authentication code
App.use((req, res, next) => {
let token = getToken(req);

  if (token) {
    jwt.verify(token, "password, (err, decoded) => {

      if (err) {
        throw "Failed to authenticate token.";
      } else {
        req.user = decoded;
        next();
      }
    });
  } else {
    throw "No token provided.";
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...