Введение:

В веб-приложении обычно используется несколько уровней доступа и авторизации, таких как роли администратора и пользователя. Использование нескольких веб-токенов JSON в приложении может быть способом обработки различных уровней доступа и авторизации. Однако реализация множественной аутентификации JWT Bearer может быть сложной и затруднительной.

Описание:

Аутентификация носителя JWT — это способ защитить приложение путем проверки подлинности веб-маркера JSON (JWT), который отправляется в заголовке запроса. Затем приложение может использовать информацию, закодированную в JWT, для определения уровня доступа и авторизации для пользователя. При наличии нескольких уровней доступа и авторизации, таких как роли администратора и пользователя, может быть полезно использовать множественную аутентификацию JWT Bearer. Каждый JWT можно настроить для предоставления определенных уровней доступа к определенным маршрутам или ресурсам.

Подходы:

  1. Один из подходов к использованию нескольких аутентификаций JWT Bearer заключается в создании отдельного промежуточного программного обеспечения для каждой роли. Промежуточное ПО можно использовать для проверки JWT и проверки соответствующей роли, прежде чем разрешать доступ к маршруту или ресурсу.
  2. Другой подход заключается в создании единого промежуточного программного обеспечения, которое может выполнять несколько ролей. В этом случае промежуточное ПО будет проверять наличие соответствующей роли в JWT, прежде чем разрешить доступ к маршруту или ресурсу.

Примеры кода:

1. Использование нескольких промежуточных программ:

const express = require("express");
const jwt = require("jsonwebtoken");
const app = express();
const adminJWT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYWRtaW4ifQ.dXhLZzR_cG0HOfzNU6ZhU6Z5FwQdU_98eU50Mk1eC5E";
const userJWT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoidXNlciJ9.Kcq3V7g8k-xuX7F05lgZDYhZl3Eq3wqw3-kmpG2_hgs";
function verifyAdminJWT(req, res, next) {
  try {
    const decoded = jwt.verify(req.headers.authorization, adminJWT);
    req.admin = decoded;
    next();
  } catch (err) {
    res.status(401).send("Admin token is not valid");
  }
}
function verifyUserJWT(req, res, next) {
  try {
    const decoded = jwt.verify(req.headers.authorization, userJWT);
    req.user = decoded;
    next();
  } catch (err) {
    res.status(401).send("User token is not valid");
  }
}
app.get("/admin", verifyAdminJWT, (req, res) => {
  res.send("Hello Admin");
});
app.get("/user", verifyUserJWT, (req, res) => {
  res.send("Hello User");
});
app.listen(3000, () => {
  console.log("Server started on port 3000");
});

В этом примере мы создали две промежуточные функции, verifyAdminJWT и verifyUserJWT, которые отвечают за проверку JWT. и проверка соответствующей роли. Строки adminJWT и userJWT являются примерами секретных ключей, которые будут использоваться для подписи JWT.
Каждый маршрут («/admin» и «/user») защищен разным промежуточным ПО, и пользователь с определенной ролью может получить доступ только к соответствующему маршруту.

2. Использование единого промежуточного ПО:

const express = require("express");
const jwt = require("jsonwebtoken");
const app = express();
const secret = "secretkey";
function verifyJWT(req, res, next) {
  try {
    const decoded = jwt.verify(req.headers.authorization, secret);
    if (decoded.role === "admin") {
      req.admin = decoded;
      next();
    } else if (decoded.role === "user") {
      req.user = decoded;
      next();
    } else {
      res.status(401).send("Invalid role");
    }
  } catch (err) {
    res.status(401).send("Token is not valid");
  }
}
app.get("/admin", verifyJWT, (req, res) => {
  res.send("Hello Admin");
});
app.get("/user", verifyJWT, (req, res) => {
  res.send("Hello User");
});
app.listen(3000, () => {
  console.log("Server started on port 3000");
});

В этом примере мы создали единственную функцию промежуточного программного обеспечения, verifyJWT, которая отвечает за проверку JWT и проверку соответствующей роли. Строка `secret` является примером секретного ключа, который будет использоваться для подписи JWT.
Каждый маршрут защищен этой единственной промежуточной функцией, и эта функция проверяет роль, указанную в JWT, прежде чем разрешить доступ к маршрут.

Действия для запуска приложения:
1. Вам необходимо установить экспресс и jsonwebtoken в проекте, выполнив команду:

npm install express jsonwebtoken

2. Чтобы запустить приложение, введите команду `node ‹filename›.js`, где `‹filename›` – это имя файла, в котором вы сохранили приведенный выше код.
3. Отправьте запрос GET на любой маршрут «/admin» или «/user», используя соответствующий JWT в заголовке авторизации.

Важно отметить, что эти примеры предоставлены в образовательных целях и не предназначены для использования в производственной среде. Секретные ключи, используемые для подписи JWT, должны надежно храниться и никогда не должны быть жестко закодированы в приложении.