我正在寻找“限制”特定路线的最佳方式,我将用一个例子来解释它:
我有两个用户:
-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进行此操作的最佳方法是什么?
答案 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.'});
});
您可以使用有效负载存储userId
,admin : true/false
之类的信息以授权对中间件的访问。
要获得更完整的授权处理,我建议您还使用授权 像 CASL 这样的软件包以及JWT策略。