使用 passport-local 保护 API
Securing an API using passport-local
切入正题。我使用 passport-local 构建了一个安全的应用程序,所有路线都被很好地覆盖了。我的应用程序所做的是从 mongo 获取数据并将其作为 api 服务器提供,进而提供 d3 图表。现在我所有的网页都是安全的,但我可以在不登录应用程序的情况下访问 api。
以下是我的页面在 route.js
中的结构
app.get('/dashboard', isLoggedIn, function(req, res) {
res.render('dashboard.html', {
user : req.user
});
});
这就是我的 api 代码的样子:
app.get('/api/finanData1', function(req, res) {
// use mongoose to get all nerds in the database
Subjects.find({}, {'_id': 0}, function(err, subjectDetails) {
// if there is an error retrieving, send the error.
// nothing after res.send(err) will execute
if (err)
res.send(err);
else
res.json(subjectDetails); // return all nerds in JSON format
});
});
我尝试对 api 代码建模,但没有成功。非常感谢对此的任何帮助。
谢谢。
编辑
回答 isLoggedIn 中间件的问题,
我将 api 代码修改为:
app.get('/api/finanData1', isLoggedIn, function(req, res) {
// use mongoose to get all nerds in the database
Subjects.find({}, {'_id': 0}, function(err, subjectDetails) {
// if there is an error retrieving, send the error.
// nothing after res.send(err) will execute
if (err)
res.send(err);
else
// return all nerds in JSON format
res.json(subjectDetails, {
user : req.user
});
});
});
现在,当我尝试在未登录的情况下访问 api 时,我被带到了完美的登录页面。但是在登录到应用程序后,我的图表不会填充。如果我在登录时打开 api link,我将收到此响应,而不是应该存在的 json 数据:
{"user":{"_id":"55f2f701f26336d85c28012b","__v":0,"local":{"password":"a$Z69k5PqxWQi5jxFNm2g/xOIAG/QG9L1ud/lO0kJHhDWQWPm2Zfl4e","email":"anmol.koul@wincere.com"}}}
我也应该共享我的服务器文件吗?
您从 api 获得的响应正是您传递给 json 响应助手的响应:
{ user : user_serialized }
将您的 res.json 行改回简单的 return 结果:
res.json(subjectDetails)
如果除了数据之外还需要用户,您必须 return 一个更复杂的对象,然后映射到客户端上的数据 属性 以绘制图表:
var response = {
data: subjectDetails,
user: req.user
};
res.json(response);
切入正题。我使用 passport-local 构建了一个安全的应用程序,所有路线都被很好地覆盖了。我的应用程序所做的是从 mongo 获取数据并将其作为 api 服务器提供,进而提供 d3 图表。现在我所有的网页都是安全的,但我可以在不登录应用程序的情况下访问 api。
以下是我的页面在 route.js
中的结构 app.get('/dashboard', isLoggedIn, function(req, res) {
res.render('dashboard.html', {
user : req.user
});
});
这就是我的 api 代码的样子:
app.get('/api/finanData1', function(req, res) {
// use mongoose to get all nerds in the database
Subjects.find({}, {'_id': 0}, function(err, subjectDetails) {
// if there is an error retrieving, send the error.
// nothing after res.send(err) will execute
if (err)
res.send(err);
else
res.json(subjectDetails); // return all nerds in JSON format
});
});
我尝试对 api 代码建模,但没有成功。非常感谢对此的任何帮助。
谢谢。
编辑 回答 isLoggedIn 中间件的问题, 我将 api 代码修改为:
app.get('/api/finanData1', isLoggedIn, function(req, res) {
// use mongoose to get all nerds in the database
Subjects.find({}, {'_id': 0}, function(err, subjectDetails) {
// if there is an error retrieving, send the error.
// nothing after res.send(err) will execute
if (err)
res.send(err);
else
// return all nerds in JSON format
res.json(subjectDetails, {
user : req.user
});
});
});
现在,当我尝试在未登录的情况下访问 api 时,我被带到了完美的登录页面。但是在登录到应用程序后,我的图表不会填充。如果我在登录时打开 api link,我将收到此响应,而不是应该存在的 json 数据:
{"user":{"_id":"55f2f701f26336d85c28012b","__v":0,"local":{"password":"a$Z69k5PqxWQi5jxFNm2g/xOIAG/QG9L1ud/lO0kJHhDWQWPm2Zfl4e","email":"anmol.koul@wincere.com"}}}
我也应该共享我的服务器文件吗?
您从 api 获得的响应正是您传递给 json 响应助手的响应:
{ user : user_serialized }
将您的 res.json 行改回简单的 return 结果:
res.json(subjectDetails)
如果除了数据之外还需要用户,您必须 return 一个更复杂的对象,然后映射到客户端上的数据 属性 以绘制图表:
var response = {
data: subjectDetails,
user: req.user
};
res.json(response);