node.js – 使用范围保护API(oauth2orize,passport,express,Nodejs)

我正在尝试使用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

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...