2017-07-03 63 views
0

在我的節點後端,我有一個服務器呈現管理頁面的端點。 使用json Web令牌完成身份驗證,因此我想用jwt保護對此頁面('/ admin')的訪問,並確保只有管理員才能訪問此頁面。使用json web令牌保護管理頁面

問題是,當我得到這個頁面時(例如,如果我在url欄中輸入www.mydomain.com/admin),我無法在授權標頭中傳輸jwt。

所以我問我怎麼能保護訪問這個頁面?

注:我用passport與地方戰略和express-jwt

這裏的端點代碼:

// routes 
// login is handled by auth subapp. 
router.get('/', jwt, jwtAdmin, (req, res) => { 
    Game.findAll({order: [['g_name', 'ASC']]}).then(games => { 
    if (!games) { 
     res.status(404).send({error: "No games..."}); 
     return; 
    } 
    res.status(200).render('sections/admin', 
    Object.assign(viewOptions, { 
     games 
    })); 
    }).catch(error => res.status(500).json({error})); 
}); 

智威湯遜中間件:

const jwt = require('express-jwt'); 
const blacklist = require('express-jwt-blacklist'); 

module.exports = jwt({secret: process.env.SECRET, isRevoked: blacklist.isRevoked}); 

jwtAdmin中間件:

module.exports = (req, res, next) => { 
    if (!req.user) { 
    res.status(401).send('you should login !'); 
    return; 
    } 

    if (!req.user.admin) { 
    res.status(401).send('admin only !'); 
    return; 
    } 
    next(); 
} 

謝謝!

回答

0

答案是通過cookie傳遞令牌。

express-jwt有一個特殊的方法(getToken)來創建自定義邏輯來解碼jwt。通過實現這一點,你可以說,如果授權頭中沒有jwt,請從cookie中解碼。

module.exports = jwt({ 
    secret: JWT_SECRET, 
    getToken: function readFromBearerOrCookies(req) { 
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { 
     return req.headers.authorization.split(' ')[1]; 
    } else if (req.cookies && req.cookies.jwt) { 
     return req.cookies.jwt; 
    } 
    console.log('No token received...'); 
    return null; 
    } 
});