嗨贾里德,
我很难理解护照如何处理范围。 这是我的场景:
我有一个令牌存储,每个令牌都有一个附加范围。 我有一些路由只有具有管理范围的令牌才能访问,而其他路由则需要正常的令牌访问。 在我的应用程序中,我会做这样的事情:
app.use('/v1', passport.authenticate('bearer', { session: false }):
为了捕捉正常情况和需要管理员权限的特定路由,我会在路由的中间件中添加类似的内容,比如
..passport.authenticate('bearer', { session: false, scopes: ['admin']})
护照是否支持这一点,还是我必须采取不同的做法?
为了完整起见,这就是我现在正在做的事情:我只是将范围添加到用户对象并使用 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 对象,因此应用程序需要就所提供的内容制定约定。 我希望这对于实现通用授权中间件也很有用。
该功能与利用它的OAuthorize和OAuth2orize的开发相吻合。 它们可用于分别实现 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 对象,所以应用程序需要解决
关于所提供内容的约定。 我希望这将证明
对于实现通用授权中间件也很有用。该功能与利用它的OAuthorize和OAuth2orize的开发相吻合。 他们
可用于分别实现 OAuth 1.0 和 2.0 服务器。 我想
我看过你制作的关于这个主题的 Quora 页面。 太好了
把这些加进去!一如既往,给我任何反馈。 干杯!
直接回复此邮件或在 GitHub 上查看:
https://github.com/jaredhanson/passport-http-bearer/issues/2#issuecomment -6966368
最有用的评论
@mwawrusch我有一个解决方案,我很满意并且运行良好,这是你提到的稍微清理过的版本。
您现在可以将第三个参数传递给成功,它由 Passport 附加在
req.authInfo
然后可以在中间件中使用 info 参数,以实现授权和访问控制。
info
只是一个通用的 JSON 对象,因此应用程序需要就所提供的内容制定约定。 我希望这对于实现通用授权中间件也很有用。该功能与利用它的OAuthorize和OAuth2orize的开发相吻合。 它们可用于分别实现 OAuth 1.0 和 2.0 服务器。 我想我已经看过你制作的关于这个主题的 Quora 页面。 将这些添加到其中会很棒!
一如既往,给我任何反馈。 干杯!