在Express和NodeJ上保护路由

时间:2017-04-21 23:32:16

标签: angularjs node.js api express jwt

我正在寻找“限制”特定路线的最佳方式,我将用一个例子来解释它:

我有两个用户:

-user1 id:123

-user2 id:456

客户端(Angular):

//LOGGED AS USER 123
$http.post('www.domain.com/api/user/123')
.then(function (data) {
  // here I should receive the data from user 123
})

上面的代码很容易做到,但我想仅针对用户123重新解析此端点(从服务器端)。如果用户456试图获取该端点,则应该踢它。例如:

//LOGGED AS USER 456
$http.post('www.domain.com/api/user/123')
.then(function (data) {
  // should return error (forbidden resource)
})

如您所见,如果您以456用户身份登录,则可以从“api / user / 123”获取数据,但您可以从“api / user / 456”获取数据

我想从服务器端解决此问题

问题:

使用Node / Express / JWT进行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

我将使用其他URL设计。而不是

www.domain.com/api/user/123

我会拥有

www.domain.com/api/user

然后从与请求一起发送的身份验证令牌或会话ID中发现用户ID。

我已经看到许多授权/安全性错误,这些错误来自于在URL中指定身份。如果考虑一下,它实际上是在复制用户ID参数,因为它在URL中出现一次,在身份验证令牌中出现一次。这种重复通常会导致授权逻辑与自身不同步的问题。

答案 1 :(得分:0)

创建中间件/authorize.js

const fs = require('fs');
const jwt = require('jsonwebtoken');

module.exports = (req, res, next) => {
    console.log('in!');
    let key = fs.readFileSync('rsa_2048_pub.pem');
    // If you are using default HMAC key the line above would be something like this:        
    // let key = process.env.JWT_SECRET // nodemon.json file needed for this to work

    try{
        const token = req.headers.authorization.split(' ')[1]; //req.headers.token;
        console.log(token);
        var decoded = jwt.verify(token, key)
        console.log(decoded);

        // add validation code here...

        next();

    }catch(err){
      return res.status(401).json({error: err, message: 'Invalid token.'});
    }
};

在routes / users.js中,您将导入中间件并具有以下内容:

const User = require('../models/user')
const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const authorize = require('../middleware/authorize'); //import your middleware

// add your middleware call to your routes
router.route('/validate-token').get(authorize, function(req,res, next){
  console.log('out!');

  res.status(200).json({message: 'Valid token.'});
});

您可以使用有效负载存储userIdadmin : true/false之类的信息以授权对中间件的访问。

  

要获得更完整的授权处理,我建议您还使用授权   像 CASL 这样的软件包以及JWT策略。