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

时间:2013-12-18 14:35:47

标签: node.js web-services postgresql angularjs heroku

我有一个PEAN (Postgre, Express, Angular, NodeJS) Stack申请。 Web服务使用

编写
  

节点和快递

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

现在,例如,当我点击Heroku帐户{@ 3}}上部署的网址时,我实际上可以在浏览器上看到所有JSON数据。

无论如何,我是否可以在外行人访问网址和提供给他的数据之间加上一层,或者是它必须工作的方式。

感谢所有回复。我已经检查了OAuth npm包,但是它提供了基本的会话管理功能,是否有任何特定的功能可以满足我的目的?

2 个答案:

答案 0 :(得分:1)

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

如果您正在追求安全性和身份验证,那就是另一回事: - )

答案 1 :(得分:1)

我试图实现类似的东西,

您可以使用带有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);