我使用名为tcp-proxy
的nodejs模块将请求从客户端传输到代理服务器以代理请求。
我希望此代理仅在用户提供用户名和密码时才能工作,因此我修改了代码以使客户端在继续之前发送代理身份验证标头。
这是我的javascript代码:
var tcpProxy = require('tcp-proxy');
var server = tcpProxy.createServer({
target: {
host: 'HOST'
port: 'PORT'
}
});
server.listen(8000);
server.on('connection', (socket) => {
socket.on('data', (data) => {
if(!authorized(data, socket)) {
socket.write('HTTP/1.1 407 Proxy Authentication Required\nProxy-Authenticate: Basic realm=""\nConnection: keep-alive');
socket.write('\n\r\n');
socket.end();
}
});
});
function authorized(data, socket) {
if(socket.auth){
return true;
}
for(var i=0; i<=10; i++) {
if(data.toString().split('\r\n')[i]) {
var headerType = data.toString().split('\r\n')[i].split(':')[0];
if(headerType == "Proxy-Authorization") {
var header = data.toString().split('\r\n')[i].split(':')[1];
var creds = new Buffer(header.split(' ')[2], 'base64').toString().split(':');
var username = creds[0];
var password = creds[1];
if(username === "USERNAME" && password === "PASSWORD") {
socket.auth = true;
return true;
} else {
return false;
}
}
}
}
return false;
}
Chrome 和 Mozilla Firefox 中的一切正常,但在 Safari 和其他一些客户端应用程序中,它无法按预期工作。
我尝试调试并发现当从Safari浏览器发出https
请求时(在Mac上的Wifi设置中设置了代理),请求中缺少Proxy-Authorization
标头,同样的情况也会发生与其他一些客户端应用程序可以选择使用代理服务器。
由于我的代理服务器应该删除请求,如果它没有找到标题,它会为Safari执行此操作。
为什么会这样?任何使其适用于所有浏览器和应用程序的解决方案?