在 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 服务的主要内容,如果未能解决你的问题,请参考以下文章

Node js中向rest服务发送https请求的步骤

Node js中向rest服务发送https请求的步骤

在节点 js 中向移动设备发送通知

如何在 Web-push 中向特定用户发送推送通知?

无法在 JavaScript 中向 Java Web 服务(球衣)发出 CORS POST 请求?

使用 WS 安全性在 WCF .NET 中向 Java Web 服务发送请求