【发布时间】:2017-07-11 16:18:59
【问题描述】:
在这方面有一些资源和提示会非常有用,因为此时我所做的只是在每个执行查询的 API 之前编写一个中间件,以检查是否允许用户查看请求的数据。
我已经搜索过,但找不到合适的指南或教程。
例如:我有一个有用户的应用程序,当涉及到 API /users/:id 时,我如何确保用户只能看到它的数据(所以只有它的 ID)?
【问题讨论】:
标签: node.js express authorization
在这方面有一些资源和提示会非常有用,因为此时我所做的只是在每个执行查询的 API 之前编写一个中间件,以检查是否允许用户查看请求的数据。
我已经搜索过,但找不到合适的指南或教程。
例如:我有一个有用户的应用程序,当涉及到 API /users/:id 时,我如何确保用户只能看到它的数据(所以只有它的 ID)?
【问题讨论】:
标签: node.js express authorization
你可以有一个中间件模块来测试每个请求并验证用户是否有这样的权限:
var jwt = require('jwt-simple');
var db = require('../../config/db');
var bcrypt = require('bcrypt');
var user = require('../models/user');
function chkRole(roles, role) {
var r = roles.filter(function(e) {
return e === role;
});
return r.length > 0;
}
module.exports = function(req, res, next) {
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
res.header('Expires', '-1');
res.header('Pragma', 'no-cache');
var t = req.headers['cookie'] ? req.headers['cookie'].split(";")[0].split("=")[1] : null;
var token = (req.body && req.body.access_token) || (req.query && req.query.access_token) || req.headers['x-access-token'] || t;
if (token) {
try {
var U = jwt.decode(token, db.secret);
if (U.exp <= Date.now()) {
res.status(400);
res.json({
"status" : 400,
"message" : "Token Expired"
});
}
var roles;
user.findOne({
email : U.email
}, function(err, user) {
if (err)
throw err;
if (!user) {
res.status(401);
res.json({
"status" : 401,
"message" : "Invalid credentials"
});
console.log(res.status);
} else {
if (U.pass === user.password) {
if (chkRole(user.roles, 'admin') && (req.url.indexOf('/api/admin/') >= 0)) {
next();
} else if ((chkRole(user.roles, 'player') || chkRole(user.roles, 'admin')) && (req.url.indexOf('/api/game/') >= 0)) {
GLOBAL.email = user.email;
next();
} else {
res.status(403);
res.json({
"status" : 403,
"message" : "Not Authorized"
});
}
}
}
});
} catch (err) {
res.status(500);
res.json({
"status" : 500,
"message" : "Oops something went wrong",
"error" : err
});
}
} else {
res.status(401);
res.json({
"status" : 401,
"message" : "Invalid Token or Key"
});
}
};
您可以通过添加以下行在应用程序主app.js文件中注册它
app.all('/api/*', [ require('./app/middlewares/validateRequest') ]);
【讨论】: