Введение:
В веб-приложении обычно используется несколько уровней доступа и авторизации, таких как роли администратора и пользователя. Использование нескольких веб-токенов JSON в приложении может быть способом обработки различных уровней доступа и авторизации. Однако реализация множественной аутентификации JWT Bearer может быть сложной и затруднительной.
Описание:
Аутентификация носителя JWT — это способ защитить приложение путем проверки подлинности веб-маркера JSON (JWT), который отправляется в заголовке запроса. Затем приложение может использовать информацию, закодированную в JWT, для определения уровня доступа и авторизации для пользователя. При наличии нескольких уровней доступа и авторизации, таких как роли администратора и пользователя, может быть полезно использовать множественную аутентификацию JWT Bearer. Каждый JWT можно настроить для предоставления определенных уровней доступа к определенным маршрутам или ресурсам.
Подходы:
- Один из подходов к использованию нескольких аутентификаций JWT Bearer заключается в создании отдельного промежуточного программного обеспечения для каждой роли. Промежуточное ПО можно использовать для проверки JWT и проверки соответствующей роли, прежде чем разрешать доступ к маршруту или ресурсу.
- Другой подход заключается в создании единого промежуточного программного обеспечения, которое может выполнять несколько ролей. В этом случае промежуточное ПО будет проверять наличие соответствующей роли в 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, должны надежно храниться и никогда не должны быть жестко закодированы в приложении.