【问题标题】:express-jwt - isRevoked : done is not a functionexpress-jwt - isRevoked : done 不是函数
【发布时间】:2022-10-20 18:22:09
【问题描述】:

我只在用户是管理员的情况下发布产品,一切都很完美,但不幸的是,在检查用户的isRevoked 令牌时,我得到“完成不是功能”。我在检查用户是否是管理员方面做错了什么吗?

我正在使用 express-jwt(7.7.5)。

//app.js - File

app.use(authJwt());
app.use(errorHandler);
var { expressjwt: jwt } = require("express-jwt");
const { User } = require("../models/user");

function authJwt() {
    const secret = process.env.secret
    const api = process.env.API_URL;
    return jwt({
        secret,
        algorithms: ['HS256'],
        isRevoked: isRevoked,
    }).unless({
        path: [
            { url: /\/api\/v1\/products(.*)/, methods: ['GET', 'OPTIONS'] },
            { url: /\/api\/v1\/categories(.*)/, methods: ['GET', 'OPTIONS'] },
            `${api}/users/login`,
            `${api}/users/register`,
        ]
    })
}


async function isRevoked(req, payload, done) {
        console.log(payload);
        if (payload.isAdmin == false) {
            console.log('Not Admin');
            done(null, true);
        }
        console.log('Admin');
        done();

}


module.exports = authJwt;
function errorHandler(err, req, res, next) {

    if (err.name === 'UnauthorizedError') {
        // jwt authentication error
        return res.status(400).json({ status: false, message: "User not Authorized" });
    }

    if (err.name === 'ValidationError')
        //Validation error 
        return res.status(401).json({ message: err })

    // default to 500 server error
    console.log("Error Handler = ",err);
    return res.status(500).json({message : err.message});
}

module.exports = errorHandler;

【问题讨论】:

    标签: node.js jwt express-jwt


    【解决方案1】:

    根据the fine manualisRevoked 函数应该接受两个参数并返回一个 Promise。没有第三个 done 参数:

    async function isRevoked(req, payload) {
      console.log(payload);
      if (payload.isAdmin == false) {
        console.log('Not Admin');
        return true;
      }
      console.log('Admin');
      return false;
    }
    

    【讨论】:

      【解决方案2】:

      因为 isRevoked 是一个异步函数。如果我使用 consolo.log(payload.isAdmin),我将得到未定义。因此,最好创建一个 const 来使用 await 保存 isAdmin 的值

      const isRevoked = async (req, payload) => {
        const isAdmin = await payload.isAdmin;
        if (isAdmin) {
          console.log("Admin");
          return false;
        }
        console.log("Not Admin");
        return true;
      };

      【讨论】:

        猜你喜欢
        • 2022-08-21
        • 2015-10-27
        • 2017-09-10
        • 2016-08-02
        • 1970-01-01
        • 2020-10-24
        • 2020-01-09
        • 2017-04-18
        • 2019-10-07
        相关资源
        最近更新 更多