我正在尝试使用node / express创建一个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,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,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},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},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 }),res) { res.send("Restricted Function");})
我找不到访问passport.authenticate中传递给passport.use的“范围”选项的示例.我以为它是在req对象中,但我找不到它.有帮助吗?
解决方法
有点晚了.但认为这可能会有所帮助.作为第三个参数传递的info对象可以从中间件用作req.authInfo.如果您的用户对象附加了作用域,或者您已在passport.authenticate初始化级别声明了作用域,则可以通过此参数传递它并在中间件中使用.请看这个链接
Usage of scopes
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。