因此,我使用 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调用期间的身份验证弹出窗口。
这里明显的缺点是:
那么有更好的方法吗?不同的中间件包会做得更好吗?