Javascript 如何从API中删除JWT身份验证?
在abc.js文件中有一些API需要身份验证,也有一些不需要身份验证 下面是abc.js中的一个API,不需要进行身份验证。此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; } });
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是在请求之前处理的中间件