首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SIP通过代理重定向(SIP.js)

SIP通过代理重定向(SIP.js)
EN

Stack Overflow用户
提问于 2014-02-06 02:32:47
回答 1查看 5.1K关注 0票数 3

我正在尝试创建一个最小的SIP代理,该代理服务于一个目的:将请求重定向到另一个域。问题是我要重定向到的域需要授权,所以我假设我需要重写一些SIP属性,因为SIP授权部分基于目标的域名。

我尝试过发出302重定向,以及简单地代理和更改每个SIP请求的值,但似乎没有人退出。我正在使用node.js库(sip.js),并尝试过重定向和代理模块(https://github.com/kirm/sip.js/blob/master/doc/api.markdown)。

我需要如何修改SIP数据以将请求重定向到另一个域,并使身份验证能够针对另一个域进行,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-11 05:27:25

下面是我使用自己的SIP服务器获得的一个基本节点脚本。您需要从您自己的测试中替换凭据和IP地址。

代理脚本不向客户端发送重定向响应,而是代表客户端向服务器发起一个新事务。在这种模式下运行的SIP服务器更正确地称为背对背用户代理(B2BUA).我还没有添加所需的所有功能,比如匹配和将响应传递回原始客户端;这涉及到相当多的工作。

代码语言:javascript
运行
复制
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"));
  }
});
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21592903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档