Узел + Паспорт - Как внедрить JWT Role Based Auth на разных маршрутах? - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно выполнить авторизацию на основе ролей.

  • Я генерирую токен JWT с полезной нагрузкой, которая содержит данные о конкретном клиенте.Например, если им разрешено использовать функцию document & face.

  • Я создал программу passport.middleware, которая проверяет токен jwt, штраф.

  • Я применяю это промежуточное ПО jwt к моим маршрутам, хорошо.

ОДНАКО,

  • для маршрута /document. Я хочу добавить здесь охрану, чтобы проверить, имеет ли полезная нагрузка jwt idcheck.document == true.
  • Аналогично, пользователь может вызвать конечную точку /face, только если idcheck.face == true

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


1./ auth / token (Генерация токена JWT)

   const payload = {
        idcheck: {
            productId,
            document: true,
            face: false,
        },
    };

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

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

2.passport.middleware.js

private jwtStrategy(): void {

        const verifyOptions: StrategyOptions = {

            jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
            secretOrKey: this.config.jwt.publicKey.replace(/\\n/g, "\n"),
            issuer:  this.config.jwt.issuer,
            audience:  this.config.jwt.audience,
            algorithms:  ["RS256"],
        };

        this.passport.use(new Strategy(verifyOptions, (jwtPayload, done) => {

            if (jwtPayload.idcheck === undefined) {
                console.log("no idcheck present");
                return done(null, false);
            }

            console.log("idcheck present", jwtPayload);
            return done(null, jwtPayload );
        }));
}

3.rout.js

 this.jwtGuard = PassportMiddleware.authenticate("jwt", { session: false });

 this.router.post("/document", this.jwtGuard, this.controller.document);
 this.router.post("/face", this.jwtGuard, this.controller.face);

1 Ответ

0 голосов
/ 25 октября 2018

Промежуточное программное обеспечение для паспортной аутентификации добавляет в вашем случае jwtPayload к вашему req.user свойству для использования в следующем промежуточном программном обеспечении http://www.passportjs.org/docs/authenticate/

const checkDocsMiddleware = (req, res, next) =>  {
     if(req.user && !req.user.idCheck.document) {
       next(new Error('Document is false'))
     } else {
       next()
     }
}

this.router.post("/document", this.jwtGuard, checkDocsMiddleware, this.controller.document);

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

...