将Web服务隐藏到NodeJS中的外行用户

我有一个PEAN (Postgre, Express, Angular, NodeJS) Stack应用程序。 Web服务使用

节点和快车

使用工厂方法在AngularJS service.js使用。

现在,例如,当我点击部署在Heroku帐户上的URL,如xyz.herokuapp.com/getXYZ,那么我实际上可以看到浏览器上的所有JSON数据。

无论如何,我可以在外行打url和向他提供什么数据之间加上一层,或者它是如何工作的。

感谢所有的回应。 我已经使用OAuth npm软件包进行了检查,但是它提供了基本的会话pipe理function,有什么具体的东西可以满足我的目的吗?

我试图实现类似的东西,

您可以使用JSON Web令牌的护照本地策略

/ 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); 

如果您的目标是向使用浏览器访问api URL的人员提供不同的内容,则可以让您的Express站点检查请求标头Accept。 如果Accept是“text / html”服务,则用任何你想要的(在布局或API文档中格式化该数据的方式等)的HTML页面,如果Accept为“application / json”则为API数据提供服务。

如果是安全和身份validation,那是另一回事:-)