![](/img/trans.png)
[英]Angular + Node + Express + Passport + oauth2orize unique CORS issues
[英]Protecting an API with Scopes (oauth2orize, passport, express, Nodejs)
我正在嘗試使用node / express創建一個API,並使用Passport和oauth2orize保護它。 我已經使用了API,我已經使用了oauth2,但是我似乎無法弄清楚如何使用范圍來實現安全的API方法。
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");})
我無法找到訪問通過password.authenticate傳遞給Passport.use的“ scope”選項的示例。 我以為它在req對象中,但是我在那兒找不到它。 有什么幫助嗎?
有點晚了。 但是認為這可能會有所幫助。 您可以從中間件中將您作為第三個參數傳遞的信息對象用作req.authInfo 。 如果您的用戶對象附帶有作用域 ,或者在護照.authenticate初始化級別上聲明了作用域 ,則可以通過此參數將其傳遞並在中間件中使用。 請查看此鏈接范圍的用法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.