Как реализовать авторизацию на основе ролей в Node.js с использованием аутентификации на основе токенов? - PullRequest
0 голосов
/ 18 ноября 2018

Как я могу реализовать несколько аутентификаций в nodejs для образовательной фирмы с тремя ролями: ученик, родитель и администратор, используя подход REST API, то есть аутентификацию на основе токенов.

1 Ответ

0 голосов
/ 18 ноября 2018

0.Концепция

Маркер JWT (https://jwt.io/), содержит payload, в этой полезной нагрузке вы можете указать пользовательский объект role. В объекте роли вы можете установить логические значения для определенияесли роль - ученик, родитель или администратор.

Пример полезной нагрузки

{
  ...
  "role": {
     student: true,
     parent: false,
     admin: false,
  }
}

Когда вы собираетесь сгенерировать токен для конкретного пользователя, прикрепите данные полезной нагрузки ктокен. (Конечно, вы можете настроить данные полезной нагрузки в зависимости от того, хотите ли вы, чтобы пользователь был учеником, родителем или администратором).

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

1Генерация токена

См. https://www.npmjs.com/package/jsonwebtoken для получения дополнительной информации о генерации токена.

   const payload = {
     userid: 123,
     role: {
       student: false,
       parent: false,
       admin: true,
     },
   };

   const signOptions = {
     issuer: this.config.jwt.issuer,
     subject: payload.userid,
     audience: this.config.jwt.audience,
     expiresIn: "730d",
     algorithm: "RS256",
   };

   const token = jwt.sign(payload, this.config.jwt.privateKey.replace(/\\n/g, "\n"), signOptions);

2. Промежуточное ПО для проверки роли

Вы должны ужечто-то вроде этого, если вы используете паспорт с аутентификацией JWT.

const authGuard = PassportMiddleware.authenticate("jwt", { session: false });

router.get("/admin", authGuard, controller.index);

Нам нужно новое промежуточное программное обеспечение для обработки проверки ролей.Мы назовем это промежуточное ПО adminGuard.После аутентификации с использованием промежуточного программного обеспечения authGuard объект req будет содержать пользователя (который является полезной нагрузкой jwt).Теперь, когда у нас есть информация о пользователях, мы можем проверить, какую роль они выполняют.

const adminGuard = (req, res, next) =>  {
     if(req.user && !req.user.role.admin) {
       next(new Error('You are not an admin'));
     } else {
       next();
     }
}

router.get("/admin", authGuard, adminGuard, controller.index);

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

...