【问题标题】:Protecting an API with Scopes (oauth2orize, passport, express, Nodejs)使用 Scopes 保护 API(oauth2orize、passport、express、Nodejs)
【发布时间】:2015-06-11 11:17:20
【问题描述】:

我正在尝试使用 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, 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");})

我找不到访问在 passport.authenticate 中传递给 passport.use 的“范围”选项的示例。我以为它在 req 对象中,但我在其中找不到它。有什么帮助吗?

【问题讨论】:

  • 嘿,你是怎么最终在这个堆栈中使用作用域的?我有同样的问题,但不知道如何使用范围。

标签: node.js express scope passport.js oauth2orize


【解决方案1】:

有点晚了。但认为这可能会有所帮助。您作为第三个参数传递的 info 对象可以从中间件用作 req.authInfo。如果您将 scope 附加到 user 对象,或者如果您已在 passport.authenticate 初始化级别声明它,则可以通过此参数传递它并在中间件中使用。请查看此链接Usage of scopes

【讨论】:

  • 你成就了我的一天!谢谢!
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 2017-08-10
  • 2019-08-13
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2012-08-29
  • 2021-10-19
相关资源
最近更新 更多