节点+护照-如何在不同的路由上实现基于JWT角色的Auth?

时间:2018-10-25 12:27:43

标签: node.js express jwt passport.js

我需要执行基于角色的身份验证。

  • 我正在使用包含有关特定客户数据的有效负载生成JWT令牌。例如,如果允许他们使用documentface功能。

  • 我创建了一个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。 password.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。 route.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 :(得分:1)

在您的情况下,护照认证中间件会将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);

我会根据您要添加的规则亲自添加一个中间件。