在 NodeJS 中向外行用户隐藏 Web 服务
Posted
技术标签:
【中文标题】在 NodeJS 中向外行用户隐藏 Web 服务【英文标题】:Hiding Webservices to a layman User in NodeJS 【发布时间】:2014-01-06 19:09:05 【问题描述】:我有一个PEAN (Postgre, Express, Angular, NodeJS) Stack
应用程序。 Web 服务是使用
节点和快递
使用工厂方法在AngularJS
service.js
中使用。
现在例如,当我点击部署在 Heroku
帐户上的 URL 时,例如 xyz.herokuapp.com/getXYZ,然后我实际上可以在浏览器上看到所有 JSON
数据。
不管怎样,我可以在外行点击 URL 和提供给他的数据之间放置一个层,还是它必须工作的方式。
感谢所有回复。我已经检查过 OAuth npm 包,但它提供了基本的会话管理工具,有什么特定的东西可以满足我的目的吗?
【问题讨论】:
他们是否可以将数据视为 JSON 有什么关系?他们为什么要使用浏览器访问 API url? 如果有不法之徒试图访问。安全漏洞可能是。根据公司标准,这只是一个安全方面。 这不安全......它只是在一种情况下掩盖了 JSON 数据。如果他们想访问 URL 和数据,访问起来很容易。最简单的选择是您不接受的答案。 【参考方案1】:如果您的目标是向使用浏览器访问 api URL 的人提供不同的内容,您可以让您的 Express 站点检查请求标头 Accept。如果 Accept 是“text/html”,则为 HTML 页面提供您想要的任何内容(数据格式为该方法的布局或 API 文档等),如果 Accept 是“application/json”,则提供 API 数据。
如果您追求的是安全和身份验证,那就另当别论了 :-)
【讨论】:
是的,我正在考虑安全性和更高的架构视图。【参考方案2】:我正在尝试实现类似的东西,
您可以使用带有 JSON Web Token 的护照本地策略
/login/ 提供了用户名和密码,如果两者都正确,它将发送 JWT
然后您将每个请求收到的令牌发送到受保护的路由器
示例代码:
var pg = require('pg');
var express = require('express');
var bodyParser = require('body-parser');
var passport = require('passport');
var jwt = require('jsonwebtoken');
var jwtcheck = require('express-jwt');
var LocalStrategy = require('passport-local').Strategy;
var app = express();
app.use(bodyParser.urlencoded( extended: true ));
app.use(bodyParser.json());
app.use(passport.initialize());
app.use(express.static(__dirname + '/client'));
secret = 'aMdoeb5ed87zarRdkD6greDZL81DcnrzeSD648ferFejmplx';
var port = process.env.PORT || 8080; // set our port
var User = [
id: 1, Username: 'bob', password: 'secret', email: 'bob@example.com',apikey: 'bob'
, id: 2, Username: 'joe', password: 'birthday', email: 'joe@example.com',apikey: 'gfsdgsfgsfg'
];
function findByApiKey(apikey, fn)
for (var i = 0, len = User.length; i < len; i++)
var user = User[i];
if (user.apikey === apikey)
return fn(null, user);
return fn(null, null);
passport.use('login', new LocalStrategy(
function(username, password, done)
findByApiKey(username, function (err, user)
if (err) return done(err);
if (!user)
return done(null, false, message: 'Incorrect username.' );
return done(null, user);
);
));
app.post('/login', function(req, res, next)
passport.authenticate('login', function(err, user, info)
if (err) return next(err)
if (!user)
return res.json(401, error: 'message' );
var token = jwt.sign( username: 'somedata', secret, expiresInMinutes: 2 );
res.json( token : token );
)(req, res, next);
);
app.get('/db/:db/schema/:schema/relation/:relation/:id',
jwtcheck(secret: secret),
function(req, res)
var conString = "postgres://ali@localhost/rest";
var client = new pg.Client(conString);
client.connect(function(err)
if(err)
return console.error('could not connect to postgres', err);
client.query('SELECT * from ' + req.params.schema +'.'+ req.params.relation , function(err, result)
if(err)
return console.error('error running query', err);
res.send(JSON.stringify(result.rows));
client.end();
);
);
);
app.listen(port);
【讨论】:
有用的网址kdelemme.com/2014/03/09/…auth0.com/blog/2014/01/07/… 感谢@Ali!我只用过护照。虽然没有更新答案!感谢您的详尽解释!干杯! :D以上是关于在 NodeJS 中向外行用户隐藏 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章