1

我尝试通过 Oauth2 和 nodeJS 保护我的 api 端点。我遵循 Oauth2orize 的 Github 页面中提供的所有示例,并自定义 db 以检索 MySQL 服务器中的数据。令牌存储在 DB 中,与 uid 的用户配置文件相关联。

最后,当我调用我的 URL /api/userinfo 时,我的承载策略没有被调用,我的控制台中没有输出(甚至是 console.log)。

请在下面找到代码:

app.get('/api/userinfo', user.info);

exports.info = [
  passport.authenticate('bearer', { session: false }),
  function(req, res) {
    // req.authInfo is set using the `info` argument supplied by
    // `BearerStrategy`.  It is typically used to indicate scope of the token,
    // and used in access control checks.  For illustrative purposes, this
    // example simply returns the scope in the response.
    res.json("Hello")
  }
]

passport.use(new BearerStrategy({},
  function(accessToken, done) {
    console.log("gell");
    db.accessTokens.find(accessToken, function(err, token) {
      if (err) { return done(err); }
      if (!token) { return done(null, false); }
      db.users.find(token.userID, function(err, user) {
        if (err) { return done(err); }
        var info = { scope: '*' }
        console.log(user.cn)
        done(null, user, info);
      });
    });
  }
));

任何想法为什么不调用此策略?我该如何调试这种情况?

4

1 回答 1

1

一直以来,但让我们回答:

首先,尝试命名您的策略,这就是我所做的:

passport.use('user-bearer', new BearerStrategy(
  function(accessToken, done) {
    jwt.verify(accessToken, config.secrets.session, (err, decoded) => {
      if (err) { return done(null, false, err); }

      // On future, scopes can ve taken from token.
      var info = {
        scope: '*'
      };
      done(null, decoded, info);
    });
  }
));

稍后,您可以像这样进行验证:

export function isAuthenticated() {
  return passport.authenticate('user-bearer', {
    session: false
  });
}

就我而言,我使用的是无状态令牌,这就是我使用 jwt Web 令牌的原因。

这个isAuthenticated函数是这样使用的:

router.get('/', login.isAuthenticated(), controller.index);

因此,每次调用此路由时都会调用中间件。

在您的 casem 上,您的中间件实现可能无法正确插入到您想要的路线上。

于 2016-08-30T17:05:14.263 回答