2017-07-03 12 views
0

私のノードのバックエンドには、管理ページをレンダリングするエンドポイントがあります。 認証はjson webトークンで行われますので、このページ( '/ admin')へのアクセスをjwtで保護し、管理者だけがこのページにアクセスできるようにします。json Webトークンで管理ページを保護する

問題は、このページを取得したときに承認ヘッダにjwtを送信できないことです(たとえば、URLバーにwww.mydomain.com/adminと入力した場合)。

このページへのアクセスを保護するにはどうすればよいですか?

注:私は地元の戦略に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})); 
}); 

JWTミドルウェア:

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

答えは、クッキーによってトークンを渡すことでした。

express-jwtにはjwtをデコードするカスタムロジックを作成する特別なメソッド(getToken)があります。これを実装することで、認証ヘッダーにjwtがない場合は、クッキーからデコードすることができます。

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; 
    } 
}); 
関連する問題