繁体   English   中英

保护Express和NodeJ上的路由

[英]Securing routes on Express and NodeJs

我正在寻找“限制”特定路线的最佳方法,我将通过一个示例进行说明:

我有两个用户:

-user1 ID:123

-user2 ID:456

客户端(角度):

 //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的最佳方法是什么?

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

www.domain.com/api/user/123

我只有

www.domain.com/api/user

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

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

创建中间件/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策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM