2015-04-07 50 views
4

我試圖用node/express創建一個API,並使用Passport和oauth2orize來保護它。我有API工作,我有oauth2的東西工作,但我似乎無法弄清楚如何實現與範圍保護API方法。使用範圍保護API(oauth2orize,passport,express,Nodejs)

的oauth2orize令牌彎,外:

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對象中,但我無法在那裏找到它。任何幫助?

+0

嘿,你是如何最終使用這個堆棧的範圍?我有同樣的問題,但無法弄清楚如何使用範圍。 –

回答

1

有點晚了。但認爲這可能有幫助。您傳遞的第三個參數的信息對象可以從中間件作爲req.authInfo。如果您有範圍附帶了用戶對象,或者您已聲明它爲passport.authenticate初始化級別,您可以將它傳遞給此參數並在中間件中使用。請看看這個鏈接Usage of scopes

+0

你讓我的一天!謝謝! – anhldbk