Node Express作为需要基本身份验证的服务器的代理

时间:2015-10-28 16:42:46

标签: ajax node.js express proxy basic-authentication

因此,我使用 express express-http-proxy 作为需要基本身份验证的API Web服务器的代理。然后在我的应用程序中,我将发出对这些API的Ajax调用。经过一番努力,我得到了这个工作,但我确信有更好的方法,因此这篇文章。

最初我按如下方式设置了快递代理:

var express = require('express'),
    app = express(),
    proxy = require('express-http-proxy');

app.use('/apis', proxy("https://myserver", {
    forwardPath: function(req, res) {
      return "/apis" + require('url').parse(req.url).path;
    }
}));

直接在浏览器中调用URL(而不是通过Ajax),例如。 https://myserver/apis/myapi.ashx,我会看到验证对话框询问我的凭据,我可以验证并查看结果。

但是,在我的应用程序中通过Ajax调用访问相同的URL时,我没有得到弹出窗口。为什么会出现这种行为差异?

所以我决定使用请求 basic-auth 添加我自己的基本身份验证中间件,如下所示:

var express = require('express'),
    app = express(),
    proxy = require('express-http-proxy'),
    request = require('request'),
    basicAuth = require('basic-auth');

var myAuth = function (req, res, next) {
    function unauthorized(res) {
        res.set('WWW-Authenticate', 'Basic realm=Rimes');
        return res.sendStatus(401);
    };

    var user = basicAuth(req);
    if (!user || !user.name || !user.pass) {
        return unauthorized(res);
    };

    var connectUrl = 'https://'+user.name+':'+user.pass+'@myserver/apis/connect.ashx';
    request.get(connectUrl, function(error, response, body) {
        if (!error && response.statusCode == 200) {
            return next();
        } else {
            return unauthorized(res);
        }
    });
};

app.use('/apis', proxy("https://myserver", {
    forwardPath: function(req, res) {
        return "/apis" + require('url').parse(req.url).path;
    }
}));

这很好用,向我展示了Ajax调用期间的身份验证弹出窗口。

这里明显的缺点是:

  • 每个API请求的凭据验证,尽管可能有一种方法可以缓存有效凭据。但在它的辩护中,这只是在开发环境中。

那么有更好的方法吗?不同的中间件包会做得更好吗?

0 个答案:

没有答案