Простой Express JS API токен - PullRequest
0 голосов
/ 03 июня 2018

Мне интересно, как я могу реализовать простой токен API-аутентификации без необходимости для пользователей?Я просто хочу один токен, который я могу аутентифицировать, добавив его в качестве параметра при вызове моего API.

Все текущие примеры в Google, похоже, слишком спроектированы для моих нужд.У меня есть некоторые данные, хранящиеся в MongoDB, и я просто обслуживаю эти данные следующим образом:

  app.get("/", (req, res) => {
    Car.find((err, cars) => {
      if(err){
        throw err;
      }
      res.json({"cars": cars});
    });
  });

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

Есть ли способ сделать это?Я знаю, что вы не можете использовать URL-запросы на маршруте GET, поэтому я не уверен, как это будет работать.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Помните, токены несут ответственность как минимум за 2 обязательных элемента безопасности API, проходят аутентификацию и авторизацию.Вам не нужно проверять подлинность пользователей, но вы должны быть уверены, что полученный токен является токеном, а не «заголовком».

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

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

Просто следуйте этому: https://github.com/auth0/node-jsonwebtoken

и внедрите его в свое промежуточное ПО по своему желанию.

Легко, как это/

jwt.sign({ exp: Math.floor(Date.now() / 1000) + (60 * 60), data: 'foobar' }, 'secret');

jwt.verify(token, 'shhhhh', function(err, decoded) { console.log(decoded.foo) // bar });

Вы всегда можете переделать концепции, используя «Веб-заголовок» и называя его «TOKEN».Но, как я уже сказал, это «веб-заголовок», а не «веб-жетон».

0 голосов
/ 03 июня 2018

Конечно, используйте промежуточное ПО: https://expressjs.com/en/guide/using-middleware.html

Для вашего случая это может быть просто так:

// checkForApiToken.js
module.exports = (req, res, next) => {
  const apiToken = req.header("api-token");
  if (process.env.API_TOKEN !== apiToken) {
      next(new Error("Unauthorized."));
      return;
  }
  next();
}

Логика проста:

  1. Получите API-TOKEN значение из заголовка.
  2. Убедитесь, что оно соответствует тому, что я определил в моем env.
    • Не соответствует, выдать ошибку, передав объект ошибки в функцию next.
  3. Соответствует, поэтому я вызываю next() без ошибок, чтобы перейти кследующий обработчик запроса.

Затем вы бы использовали его так:

app.get("/", checkForApiToken, async (req, res) => {
    const cars = await Car.find().exec();
    res.json({ cars });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...