首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Scopes保护API (oauth2orize、护照、快递、Nodejs)

用Scopes保护API (oauth2orize、护照、快递、Nodejs)
EN

Stack Overflow用户
提问于 2015-04-07 00:26:55
回答 1查看 2.9K关注 0票数 4

我正在尝试创建一个带有节点/表达式的API,并使用Passport和oauth2orize来保护它。我已经让API正常工作了,我已经开始使用oauth2了,但是我似乎不知道如何用作用域来实现API方法的安全。

oauth2orize令牌提交器-外部:

代码语言:javascript
复制
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})
            })
        })
    })
}) }))

护照持有人代币支票:

代码语言:javascript
复制
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安全性:

代码语言:javascript
复制
router.get('/restricted', passport.authenticate('accessToken', { scope: "unauthorized", session: false }), function (req, res) {
res.send("Restricted Function");})

我找不到访问passport.authenticate中传递给passport.use的“作用域”选项的例子。我以为是在req对象里,但我在里面找不到。有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2015-07-26 19:45:55

有点晚了。但我觉得这可能会有帮助。您作为第三个参数传递的info对象可以从中间件中作为req.authInfo使用。如果您的作用域附加于用户对象,或者您在passport.authenticate初始化级别声明了它,您可以通过这个参数传递它,并在中间件中使用它。请看一下这个链接作用域的使用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29481771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档