다음은 자체 SIP 서버로 작업하는 기본 노드 스크립트입니다. 당신은 당신의 자신의 테스트에 대한 자격 증명과 IP 주소를 교체해야합니다.
프록시 스크립트는 클라이언트에 대한 리다이렉트 응답을 보내지 않지만 대신 클라이언트를 대신하여 서버에 대한 새 트랜잭션을 시작합니다. 이 모드에서 작동하는 SIP 서버는 B2BUA (Back-to-Back User Agent)라고합니다. 응답을 원래 클라이언트로 다시 전달하는 등 필요한 모든 기능을 추가하지 않았습니다. 거기에 관련된 일은 공정한 것입니다.
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