如果标头中不存在JWT令牌,如何执行一些逻辑?

时间:2019-04-23 14:03:17

标签: node.js jwt passport-jwt

我正在使用passport-jwt,并且有一个端点,如果标头中不存在jwt令牌,则该端点应该从数据库返回一些数据。 是否可以应用某些逻辑而不是仅发送未经授权的401?

router.get(
    '/get/items',
    passport.authenticate('jwt', {session: false}),
    (req, res) => {
     // reaches this point only after validating token
     ...
    }
);

因此,如果存在jwt令牌,则端点应基于该令牌返回一些数据。如果没有,应该从数据库返回一些其他数据

3 个答案:

答案 0 :(得分:2)

我认为custom callback是一个选择。它作为最后一个参数传递给let arrays = [[10, 20, 30], [1, 2, 3], [100, 200, 300]]; let sums = arrays[0] .map((col, i) => arrays.map(row => row[i])) .map(a => a.reduce((a, b) => a + b, 0)); console.log(sums);方法,它将允许您设置所需的行为。

您的代码如下:

authenticate(strategy, options, callback)
  

在此示例中,请注意,从   路由处理程序,而不是用作路由中间件。这给   通过闭包对req和res对象的回调访问。

     

如果身份验证失败,则将用户设置为false。如果有例外   发生时,将设置err。一个可选的info参数将被传递,   包含策略验证提供的其他详细信息   回调。

     

回调可以使用提供的参数来处理   认证结果如所期望。请注意,使用自定义   回调,建立一个   会话(通过调用req.login())并发送响应。

     

Source

答案 1 :(得分:1)

包装中间件并按需要处理错误:

function authenticate(req, res, next) {
  passport.authenticate('jwt', { session: false }, (err, user) => {
    if (err) {
      res.status(err.statusCode || 401).json({ error: err.toString() });
      return;
    }

    if (!user) {
      res.status(404).json({ ... });
      return;
    }

    req.user = user;

    next();
  })(req, res, next);
}

改用它:

router.get(
    '/get/items',
    authenticate,
    (req, res) => {
     // reaches this point only after validating token
     ...
    }
);

答案 2 :(得分:0)

@codtex和@Dominic的答案解决了这个问题。

我发现以下解决方案也有效:

        price   time                      time_diff
    0   1    2019-04-11 03:01:53.488000   
    1   0    2019-04-11 03:27:25.768000   03:25:33
    2   1    2019-04-11 03:34:20.520000
    3   0    2019-04-11 03:36:16.556000   03:01:56

etc...