Ниже приведен базовый сценарий узла. Я работал с собственным SIP-сервером. Вам нужно будет заменить учетные данные и IP-адрес для собственного тестирования.
Прокси-скрипт не отправляет ответ на перенаправление клиенту, но вместо этого инициирует новую транзакцию на сервере от имени клиента. Сервер SIP, работающий в этом режиме, более точно называется оператором обратной связи (B2BUA). Я не добавил все необходимые функциональные возможности, такие как сопоставление и передача ответов обратно первоначальному клиенту; в этом есть справедливая работа.
var sip = require('sip');
var digest = require('sip/digest');
var util = require('util');
var os = require('os');
var proxy = require('sip/proxy');
var registry = {
'user': { user: "user", password: "password", realm: "sipserver.com"},
};
function rstring() { return Math.floor(Math.random()*1e6).toString(); }
sip.start({
address: "192.168.33.116", // If the IP is not specified here the proxy uses a hostname in the Via header which will causes an issue if it's not fully qualified.
logger: {
send: function(message, address) { debugger; util.debug("send\n" + util.inspect(message, false, null)); },
recv: function(message, address) { debugger; util.debug("recv\n" + util.inspect(message, false, null)); }
}
},
function(rq) {
try {
if(rq.method === 'INVITE') {
proxy.send(sip.makeResponse(rq, 100, 'Trying'));
//looking up user info
var username = sip.parseUri(rq.headers.to.uri).user;
var creds = registry[username];
if(!creds) {
proxy.send(sip.makeResponse(rq, 404, 'User not found'));
}
else {
proxy.send(rq, function(rs) {
if(rs.status === 401) {
// Update the original request so that it's not treated as a duplicate.
rq.headers['cseq'].seq++;
rq.headers.via.shift();
rq.headers['call-id'] = rstring();
digest.signRequest(creds, rq, rs, creds);
proxy.send(rq);
}
});
}
}
else {
proxy.send(sip.makeResponse(rq, 405, 'Method Not Allowed'));
}
} catch(e) {
util.debug(e);
util.debug(e.stack);
proxy.send(sip.makeResponse(rq, 500, "Server Internal Error"));
}
});
У вас есть учетные данные, доступные на вашем SIP-прокси? Или вы ожидаете, что клиент будет использовать свои собственные сохраненные учетные данные, когда получит ответ перенаправления от вашего прокси? Если последнее сомневается, что у вас будет большой успех, поскольку это будет проблематично с точки зрения безопасности; ваш прокси может перенаправить на премиум-номер и получить здоровенный платеж против клиента. – sipwiz
@sipwiz У меня есть учетные данные, доступные мне, чтобы я мог аутентифицироваться от имени пользователей. Просто не знаю, как это сделать. – Dan