Node API - сделайте запрос GET перед обработкой любого запроса

Я настроил свой интерфейс с перехватчиком, который всегда добавляет заголовок Authorization, если такой JWT token существует.

У меня есть 2 API, один используется для проверки авторизации, другой используется для обработки любого другого запроса данных (это тот, над которым я работаю).

В моем API данных я хочу добиться следующего:

Создайте своего рода охранник (?), Который я могу разместить вокруг определенных маршрутов api, который проверяет, присутствует ли заголовок Authorization. Затем ему необходимо вызвать другой API, чтобы проверить, действителен ли токен. Если это не удается, он возвращает ошибку, в противном случае он продолжает выполнять требуемый запрос.

Я новичок в node, и я не знаю, как это сделать правильно и наиболее эффективно. У меня недостаточно знаний, поэтому я попытался погуглить, но безрезультатно.

Я не прошу вас, ребята, написать это для меня, я просто ищу идеи, как это сделать, чтобы я мог исследовать это более глубоко, потому что прямо сейчас я не знаю, что искать или это даже возможно.

Спасибо за вашу помощь!

Обновлено: вот как я сейчас обрабатываю запрос

Маршрут

  /**
   * Add survey for a participant
   *
   * URL: /participant/survey
   * METHOD: POST
   */
  router.post('/participant/survey', function(req, res) {
    var bodyValidation = iValidator.json_schema(
      schema.addSurvey,
      req.body,
      'survey'
    );
    if (bodyValidation.valid == false) {
      return res.status(422).send(bodyValidation.errorMessage);
    }
    participantService
      .addSurvey(req.body)
      .then(data => {
        res.status(200).send({ success: true, survey: data });
      })
      .catch(err => {
        res.status(422).send(err);
      });
  });

Услуга

function addSurvey(survey) {
  return new Promise((resolve, reject) => {
    participantModel
      .addSurvey(survey)
      .then(data => {
        survey.id = data.insertId;
        resolve(survey);
      })
      .catch(err => {
        reject(err);
      });
  });
}

Модель

function addSurvey(survey) {
  return new Promise((resolve, reject) => {
    db.query(
      'INSERT INTO ...',
      (error, result) => {
        if (error) {
          dbFunc.connectionRelease;
          reject(error);
        } else {
          dbFunc.connectionRelease;
          resolve(result);
        }
      }
    );
  });
}

Привет! Пожалуйста, прочтите центр помощи, в частности Как мне задать хороший вопрос?. Людям будет проще помочь вам в много, если вы покажете нам минимальный воспроизводимый пример одного из запросов, где вам нужно это сделать, и пример кода проверки авторизации.

T.J. Crowder 08.08.2018 14:09

@ T.J.Crowder Спасибо за объяснение, как я могу улучшить свой вопрос. Я добавил код, чтобы было понятнее

Nicolas 08.08.2018 14:17

Как выглядит код авторизации?

T.J. Crowder 08.08.2018 14:21

Боковое примечание: служба показывает Конструктор Promise, антипаттерн. Вам не нужен и не нужен new Promise в нем; у вас уже есть обещание, от addSurvey. Просто верните результат цепочки на нем: pastebin.com/c2UmdNh5

T.J. Crowder 08.08.2018 14:21

@ T.J.Crowder У меня нет доступа к этому коду

Nicolas 08.08.2018 14:30

Нам не нужно видеть внутренности, нам нужно знать, как вы вызов это получите, чтобы получить авторизацию. Но в любом случае двух ответов, которые у вас уже есть, должно быть достаточно, чтобы вы в этом разобрались.

T.J. Crowder 08.08.2018 14:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
30
2

Ответы 2

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


Предполагая, что ваши обработчики маршрутов следуют стандартному шаблону:

router.get('/relevant/path', function (req, res) {
  res.send(/*...response...*/);
});

... тогда вы просто ждете, чтобы вызвать в res.send, пока не получите ответ на проверку авторизации. Вы не показали нам этот чек, но в полу-псевдокоде:

// If it provides a promise
router.get('/relevant/path', function (req, res) {
  checkAuthorization(/*...*/)
      .then(result => {
          if (result.authorized) {
              res.send(/*...response...*/);
          } else {
              res.send(/*...'not authorized' response...*/);
          }
      })
      .catch(error => {
          res.send(/*...error response, auth check failed...*/);
      });
});

или же

// If it provides a Node.js-style callback
router.get('/relevant/path', function (req, res) {
  checkAuthorization((error, result) => {
      if (error) {
          res.send(/*...error response, auth check failed...*/);
      } else {
          if (result.authorized) {
              res.send(/*...response...*/);
          } else {
              res.send(/*...'not authorized' response...*/);
          }
      }
});

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

Итак, в вашем случае вы могли бы определить весь маршрут для перехвата. Первый метод будет проверять наличие заголовка авторизации, если вы вызываете next() и Node JS перейдет к проверке следующего маршрута, или если токен не найден, вы можете отклонить запрос тут же.

После функции авторизации вы можете проверить свой API на предмет действительности токена. И примените здесь ту же логику. Возможно, вы захотите рассмотреть возможность кэширования этого ответа в зависимости от накладных расходов / задержки.

app.use((req, res, next) => {
    if (<token-exists-condition>){
        if (<token-valid-condition>){
            // Pass through your middleware onto the next route
            next();
        } else {
            res.status(401).send('Invalid token');
        }
    } else {
        res.status(401).send('No Auth Header');
    }
});

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

Другие вопросы по теме