Passport-http-bearer: 范围如何工作?

创建于 2012-03-05  ·  3评论  ·  资料来源: jaredhanson/passport-http-bearer

嗨贾里德,

我很难理解护照如何处理范围。 这是我的场景:

我有一个令牌存储,每个令牌都有一个附加范围。 我有一些路由只有具有管理范围的令牌才能访问,而其他路由则需要正常的令牌访问。 在我的应用程序中,我会做这样的事情:

app.use('/v1', passport.authenticate('bearer', { session: false }):

为了捕捉正常情况和需要管理员权限的特定路由,我会在路由的中间件中添加类似的内容,比如
..passport.authenticate('bearer', { session: false, scopes: ['admin']})

护照是否支持这一点,还是我必须采取不同的做法?

最有用的评论

@mwawrusch我有一个解决方案,我很满意并且运行良好,这是你提到的稍微清理过的版本。

您现在可以将第三个参数传递给成功,它由 Passport 附加在req.authInfo

passport.use(new BearerStrategy(
  function(token, done) {
    User.findOne({ token: token }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      return done(null, user, { scope: 'profile' });
    });
  }
));

然后可以在中间件中使用 info 参数,以实现授权和访问控制。

app.get('/api/userinfo', 
  passport.authenticate('bearer', { session: false }),
  function(req, res, next) {
    // access control middleware to check for required scope
    if (req.authInfo.scope != 'profile') {
      res.statusCode = 403;
      return res.end('Forbidden');
    }
    return next();
  }
  function(req, res) {
    res.json(req.user);
  });

info只是一个通用的 JSON 对象,因此应用程序需要就所提供的内容制定约定。 我希望这对于实现通用授权中间件也很有用。

该功能与利用它的OAuthorizeOAuth2orize的开发相吻合。 它们可用于分别实现 OAuth 1.0 和 2.0 服务器。 我想我已经看过你制作的关于这个主题的 Quora 页面。 将这些添加到其中会很棒!

一如既往,给我任何反馈。 干杯!

所有3条评论

为了完整起见,这就是我现在正在做的事情:我只是将范围添加到用户对象并使用 req.user... 并在稍后阶段检查特定路由和范围是否匹配。

@mwawrusch我有一个解决方案,我很满意并且运行良好,这是你提到的稍微清理过的版本。

您现在可以将第三个参数传递给成功,它由 Passport 附加在req.authInfo

passport.use(new BearerStrategy(
  function(token, done) {
    User.findOne({ token: token }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      return done(null, user, { scope: 'profile' });
    });
  }
));

然后可以在中间件中使用 info 参数,以实现授权和访问控制。

app.get('/api/userinfo', 
  passport.authenticate('bearer', { session: false }),
  function(req, res, next) {
    // access control middleware to check for required scope
    if (req.authInfo.scope != 'profile') {
      res.statusCode = 403;
      return res.end('Forbidden');
    }
    return next();
  }
  function(req, res) {
    res.json(req.user);
  });

info只是一个通用的 JSON 对象,因此应用程序需要就所提供的内容制定约定。 我希望这对于实现通用授权中间件也很有用。

该功能与利用它的OAuthorizeOAuth2orize的开发相吻合。 它们可用于分别实现 OAuth 1.0 和 2.0 服务器。 我想我已经看过你制作的关于这个主题的 Quora 页面。 将这些添加到其中会很棒!

一如既往,给我任何反馈。 干杯!

很好谢谢。

2012 年 7 月 13 日星期五上午 8:36,Jared Hanson <
回复@reply.github.com

写道:

@mwawrusch我有一个我很满意并且正在努力的解决方案
好吧,这是你提到的稍微清理过的版本。

您现在可以将第三个参数传递给成功,它由
req.authInfo的护照

passport.use(new BearerStrategy(
  function(token, done) {
    User.findOne({ token: token }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      return done(null, user, { scope: 'profile' });
    });
  }
));

然后可以在中间件中使用 info 参数
实施授权和访问控制。

app.get('/api/userinfo',
  passport.authenticate('bearer', { session: false }),
  function(req, res, next) {
    // access control middleware to check for required scope
    if (req.authInfo.scope != 'profile') {
      res.statusCode = 403;
      return res.end('Forbidden');
    }
    return next();
  }
  function(req, res) {
    res.json(req.user);
  });

info只是一个通用的 JSON 对象,所以应用程序需要解决
关于所提供内容的约定。 我希望这将证明
对于实现通用授权中间件也很有用。

该功能与利用它的OAuthorizeOAuth2orize的开发相吻合。 他们
可用于分别实现 OAuth 1.0 和 2.0 服务器。 我想
我看过你制作的关于这个主题的 Quora 页面。 太好了
把这些加进去!

一如既往,给我任何反馈。 干杯!


直接回复此邮件或在 GitHub 上查看:

https://github.com/jaredhanson/passport-http-bearer/issues/2#issuecomment -6966368

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

carera picture carera  ·  4评论

leomao10 picture leomao10  ·  3评论

exortech picture exortech  ·  3评论

fuzihaofzh picture fuzihaofzh  ·  3评论

zsitro picture zsitro  ·  3评论