首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从API中移除JWT身份验证?

如何从API中移除JWT身份验证?
EN

Stack Overflow用户
提问于 2018-06-21 18:23:53
回答 2查看 265关注 0票数 0

abc.js文件中有些接口需要鉴权,有些接口不需要鉴权。

下面是一个不需要认证的abc.js接口。此API放在JWT身份验证码之上。

代码语言:javascript
运行
复制
router.get('/callback',function(req,res)
{
    if(req.method === "GET"){
        console.log(req.query.abc);
        console.log(req.query.abc);
        return;
    }
}); 

然而,当我尝试调用上面的API时。它返回no access token。下面是我如何编写我的JWT身份验证:

代码语言:javascript
运行
复制
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都需要在参数中插入访问令牌。如果不需要在参数中插入访问令牌,如何调用上面的callback接口?目前,当我调用它时,它总是返回no access token

EN

回答 2

Stack Overflow用户

发布于 2018-06-21 18:34:14

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

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

代码语言:javascript
运行
复制
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.'
    });

}

});

See express JS docs

票数 1
EN

Stack Overflow用户

发布于 2018-06-21 18:46:02

使用下面的方式

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
router.get('/api/user', jwtHandler.isAuthenticate, userController.getUserDetails);

用于无身份验证的API

代码语言:javascript
运行
复制
router.post('/api/login/facebook', authController.facebookLogin);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50966173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档