使用范围保护API(oauth2orize,passport,express,Nodejs)

我正在尝试使用node / express创build一个API,并使用Passport和oauth2orize来保护它。 我有API的工作,我有oauth2的东西工作,但我似乎无法弄清楚如何实现与范围保护API方法。

oauth2orize标记hander-outer:

server.exchange(oauth2orize.exchange.password(function (client, username, password, scope, done) { scope = scope || ['unauthorized']; db.collection('oauth_users').findOne({username: username}, function (err, user) { if (err) return done(err); if (!user) return done(null, false); for (i in scope) if(user.scope.indexOf(scope[i]) < 0) return done(null, false); bcrypt.compare(password, user.password, function (err, res) { if (!res) return done(null, false); var token = utils.uid(256) var refreshToken = utils.uid(256) var tokenHash = crypto.createHash('sha1').update(token).digest('hex') var refreshTokenHash = crypto.createHash('sha1').update(refreshToken).digest('hex') var expirationDate = new Date(new Date().getTime() + (3600 * 1000)) db.collection('oauth_access_tokens').save({token: tokenHash, expirationDate: expirationDate, clientId: client.clientId, userId: username, scope: scope}, function (err) { if (err) return done(err) db.collection('oauth_refresh_tokens').save({refreshToken: refreshTokenHash, clientId: client.clientId, userId: username}, function (err) { if (err) return done(err) done(null, token, refreshToken, {expires_in: expirationDate}) }) }) }) }) })) 

护照不记名标记检查器:

 passport.use("accessToken", new BearerStrategy( {passReqToCallback: true}, function (req, accessToken, done) { console.dir(req.params); var accessTokenHash = crypto.createHash('sha1').update(accessToken).digest('hex') db.collection('oauth_access_tokens').findOne({token: accessTokenHash}, function (err, token) { if (err) return done(err); if (!token) return done(null, false); if (new Date() > token.expirationDate) { db.collection('oauth_access_tokens').remove({token: accessTokenHash}, function (err) { done(err) }); } else { db.collection('oauth_users').findOne({username: token.userId}, function (err, user) { if (err) return done(err); if (!user) return done(null, false); // no use of scopes for no var info = { scope: '*' } done(null, user, info); }) } }) })) 

API安全性:

 router.get('/restricted', passport.authenticate('accessToken', { scope: "unauthorized", session: false }), function (req, res) { res.send("Restricted Function");}) 

我可以find没有访问“范围”选项passport.authenticate传递给passport.use的例子。 我想这是在req对象,但我不能在那里find它。 任何帮助?

有点晚了 但认为这可能有帮助。 您作为第三个parameter passing的信息对象可以从中间件用作req.authInfo 。 如果你有用户对象的作用域 ,或者你已经在passport中声明了它,那么你可以通过这个parameter passing它,并在中间件中使用它。 请看这个链接范围的用法