2014-02-06 2 views
2

Я пытаюсь создать минимальный прокси-сервер SIP, который служит одной цели: перенаправляет запросы в другой домен. Ловушка - это домен, к которому я перенаправляюсь, требует авторизации, поэтому я предполагаю, что мне нужно переписать некоторые атрибуты SIP, поскольку авторизация SIP частично основана на доменном имени адресата.SIP Перенаправление через прокси (SIP.js)

Я попытался выдавать перенаправление 302, а также просто проксировать и изменять значения каждого запроса SIP, но ни один из них не может выйти из трюка. Я использую библиотеку node.js (sip.js) и пробовал модули перенаправления и прокси (https://github.com/kirm/sip.js/blob/master/doc/api.markdown).

Любые идеи о том, как мне нужно изменить данные SIP для перенаправления запросов в другой домен и активировать проверку подлинности в отношении этого другого домена?

+0

У вас есть учетные данные, доступные на вашем SIP-прокси? Или вы ожидаете, что клиент будет использовать свои собственные сохраненные учетные данные, когда получит ответ перенаправления от вашего прокси? Если последнее сомневается, что у вас будет большой успех, поскольку это будет проблематично с точки зрения безопасности; ваш прокси может перенаправить на премиум-номер и получить здоровенный платеж против клиента. – sipwiz

+0

@sipwiz У меня есть учетные данные, доступные мне, чтобы я мог аутентифицироваться от имени пользователей. Просто не знаю, как это сделать. – Dan

ответ

6

Ниже приведен базовый сценарий узла. Я работал с собственным 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")); 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^