Javascript 如何从API中删除JWT身份验证?

Javascript 如何从API中删除JWT身份验证?,javascript,node.js,Javascript,Node.js,在abc.js文件中有一些API需要身份验证,也有一些不需要身份验证 下面是abc.js中的一个API,不需要进行身份验证。此API位于JWT身份验证代码之上 router.get('/callback',function(req,res) { if(req.method === "GET"){ console.log(req.query.abc); console.log(req.query.abc); return; } });

在abc.js文件中有一些API需要身份验证,也有一些不需要身份验证

下面是abc.js中的一个API,不需要进行身份验证。此API位于JWT身份验证代码之上

router.get('/callback',function(req,res)
{
    if(req.method === "GET"){
        console.log(req.query.abc);
        console.log(req.query.abc);
        return;
    }
}); 
然而,当我试图调用上面的API时。它返回
无访问令牌
。以下是我如何编写JWT身份验证:

router.use(function(req, res, next) {

    // check header or url parameters or post parameters for token
    var token = req.query["access_token"] ;

    // decode token
    if (token) {

        // verifies secret and checks exp
        jwt.verify(token, process.env.SECRETKEY, function(err, decoded) {           
            if (err) {
                return res.json({ success: false, message: 'Failed to authenticate token.' });      
            } else {
                // if everything is good, save to request for use in other routes
                req.decoded = decoded;  
                next();
            }
        });

    } else {

        // if there is no token
        // return an error
        return res.status(403).send({ 
            success: false, 
            error: 'No access token.'
        });

    }

});

上面代码下面的任何API都需要在参数中插入访问令牌。如何调用上面的
回调
API,而无需将访问令牌插入参数?当前,当我调用它时,它不断返回
无访问令牌

router.use是中间件。它将在处理任何请求之前运行。所以之前的想法行不通

最好的方法是定义无身份验证路由:

router.use('/callback', function(req, res, next) {
   next()
}, function(req, res, next) {

// check header or url parameters or post parameters for token
var token = req.query["access_token"] ;

// decode token
if (token) {

    // verifies secret and checks exp
    jwt.verify(token, process.env.SECRETKEY, function(err, decoded) {           
        if (err) {
            return res.json({ success: false, message: 'Failed to authenticate token.' });      
        } else {
            // if everything is good, save to request for use in other routes
            req.decoded = decoded;  
            next();
        }
    });

} else {

    // if there is no token
    // return an error
    return res.status(403).send({ 
        success: false, 
        error: 'No access token.'
    });

}
}))

使用下面的方法

exports.isAuthenticate = async (req, res, next) => {
  // check header or url parameters or post parameters for token
  var token = req.body.token || req.query.token || req.headers['x-access-token'];
  if (!token) {
    return sendUnauthorizedRes(res, 'Access Token not specified.');
  }
  jwt.verify(token, constants.JWTContant.SECRET_KEY, async (err, response) => {
    if (err) {
      return sendUnauthorizedRes(res, 'Invalid access token.');
    } else {
      // if everything is good, save to request for use in other routes
      req.userInfo = response;
      if (await authModel.verify(token, req.userInfo.user._id)) {
        next();
      } else {
        return sendUnauthorizedRes(res, 'Invalid access token.');
      }
    }
  });
};
用于带身份验证的API

router.get('/api/user', jwtHandler.isAuthenticate, userController.getUserDetails);
router.post('/api/login/facebook', authController.facebookLogin);
适用于无身份验证的API

router.get('/api/user', jwtHandler.isAuthenticate, userController.getUserDetails);
router.post('/api/login/facebook', authController.facebookLogin);

它仍然返回相同的错误。当我放置断点时,回调API的If语句没有运行。/callback?access_token={{access_token}我明白了;Router.use是在请求之前处理的中间件