2012-10-23 32 views
7

Tôi đang làm việc với thư viện Jain Sip, cố tạo kết nối với máy chủ dấu hoa thị. Tôi đã làm việc với ứng dụng ví dụ textclient từ trang này: http://www.oracle.com/technetwork/articles/entarch/introduction-jain-sip-090386.htmlXác thực Jain-Sip

nhưng điều này không thực sự xác thực với máy chủ. Tôi có thể gửi tin nhắn cho người dùng trên máy chủ, nhưng tôi thường yêu cầu xác thực người dùng/mật khẩu trên máy chủ.

Theo như tôi có thể nói tôi phải sử dụng thuộc tính "javax.sip.OUTBOUND_PROXY", nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về cách đặt tên người dùng hoặc mật khẩu. Có ai khác đã thành công với điều này không?

Trả lời

7

Ví dụ tốt nhất mà tôi đã tìm thấy trên đăng ký được tìm thấy here. Dưới đây là các ý chính của nếu chỉ trong trường hợp liên kết khô-up một ngày:

yêu cầu REGISTER được sử dụng để cập nhật vị trí hiện tại của người dùng trên server đăng ký. Ứng dụng này sẽ gửi một tin nhắn REGISTER thông báo cho máy chủ vị trí hiện tại của nó mà lần lượt được lưu trữ trong máy chủ vị trí. Khi người gọi gọi cho người dùng, máy chủ proxy sử dụng thông tin này để tìm vị trí của callee.

Yêu cầu đăng ký phải được khách hàng gửi định kỳ. Giá trị của yêu cầu REGISTER được xác định bởi tiêu đề Hết hạn.

luồng

image

Mẫu Yêu cầu

REGISTER sip:sip.linphone.org SIP/2.0 
Call-ID: [email protected] 
CSeq: 1 REGISTER 
From: <sip:[email protected]>;tag=-1427592833 
To: <sip:[email protected]> 
Max-Forwards: 70 
Via: SIP/2.0/TCP 223.1.1.128:5060;branch=z9hG4bK-323532-2a454f4ec2a4213f6d6928eba479521d 
Contact: <sip:[email protected];transport=tcp> 
Content-Length: 0 

Bây giờ cho phép xem làm thế nào để xây dựng các yêu cầu trên bằng cách sử dụng NIST SIP Stack.

Bước đầu tiên là tạo lớp học triển khai SIPListener. Hãy thực hiện chắc chắn ngăn xếp SIP của bạn đang khởi chạy NIST JAIN SIP Stack.

  1. Tạo tiêu đề Call-ID

    CallIdHeader callIdHeader = this.sipProvider.getNewCallId();

  2. Tạo tiêu đề CSeq

    CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader (cseq, " REGISTER ");

  3. Tạo từ tiêu đề

    Địa chỉ fromAddress = addressFactory.createAddress ("sip:" + tên người dùng + '@' + máy chủ); FromHeader fromHeader = this.headerFactory.createFromHeader (fromAddress, String.valueOf (this.tag));

  4. Tạo To

    ToHeader toHeader = this.headerFactory.createToHeader (FROMADDRESS, null);

  5. Tạo Max-Tiền đạo tiêu đề

    MaxForwardsHeader maxForwardsHeader = this.headerFactory.createMaxForwardsHeader (70);

  6. Tạo tiêu đề Via

    ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port, "tcp", null); viaHeaders.add (viaHeader);

  7. Tạo tiêu đề xúc

    this.contactAddress = this.addressFactory.createAddress ("ngụm:" + this.username + '@' + this.ip + "vận chuyển = tcp");

    // Tạo tiêu đề liên hệ được sử dụng cho tất cả các tin nhắn SIP. this.contactHeader = this.headerFactory.createContactHeader (contactAddress);

Khi tất cả các tiêu đề được tạo, đã đến lúc tạo yêu cầu .

request = this.messageFactory.createRequest("REGISTER sip:" + server + "SIP/2.0\r\n\r\n"); 
request.addHeader(callIdHeader); 
request.addHeader(cSeqHeader); 
request.addHeader(fromHeader); 
request.addHeader(toHeader); 
request.addHeader(maxForwardsHeader); 
request.addHeader(viaHeader); 
request.addHeader(contactHeader); 

Bây giờ các đối tượng yêu cầu được tạo ra với tất cả các tiêu đề cần thiết đó là thời gian để gửi yêu cầu.

inviteTid = sipProvider.getNewClientTransaction(request); // send the request out. 
inviteTid.sendRequest(); 

Khi yêu cầu được gửi thành công phản ứng sẽ được chuyển đến các ứng dụng sử dụng callback processResponse trong SIPListener.

public void processResponse(ResponseEvent responseEvent) { 
    int statusCode = responseEvent.getResponse().getStatusCode(); 
} 

public void register(Response response) { 
    try { 
    cseq++; 
    ArrayList viaHeaders = new ArrayList(); 
    ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip, 
    this.port, "tcp", null); 
    viaHeaders.add(viaHeader); 
    // The "Max-Forwards" header. 
    MaxForwardsHeader maxForwardsHeader = this.headerFactory 
    .createMaxForwardsHeader(70); 
    // The "Call-Id" header. 
    CallIdHeader callIdHeader = this.sipProvider.getNewCallId(); 
    // The "CSeq" header. 
    CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq, 
    "REGISTER"); 

    Address fromAddress = addressFactory.createAddress("sip:" 
    + username + '@' + server); 

    FromHeader fromHeader = this.headerFactory.createFromHeader(
    fromAddress, String.valueOf(this.tag)); 
    // The "To" header. 
    ToHeader toHeader = this.headerFactory.createToHeader(fromAddress, 
    null); 

    // this.contactHeader = this.headerFactory 
    // .createContactHeader(contactAddress); 

    request = this.messageFactory.createRequest("REGISTER sip:" 
    + server + " SIP/2.0\r\n\r\n"); 
    request.addHeader(callIdHeader); 
    request.addHeader(cSeqHeader); 
    request.addHeader(fromHeader); 
    request.addHeader(toHeader); 
    request.addHeader(maxForwardsHeader); 
    request.addHeader(viaHeader); 
    request.addHeader(contactHeader); 
    if (response != null) { 
    retry = true; 
    AuthorizationHeader authHeader = Utils.makeAuthHeader(headerFactory, response, 
    request, username, password); 
    request.addHeader(authHeader); 
    } 
    inviteTid = sipProvider.getNewClientTransaction(request); 
    // send the request out. 
    inviteTid.sendRequest(); 
    this.dialog = inviteTid.getDialog(); 
    // Send the request statelessly through the SIP provider. 
    //   this.sipProvider.sendRequest(request); 

    // Display the message in the text area. 
    logger.debug("Request sent:\n" + request.toString() + "\n\n"); 
    } catch (Exception e) { 
    // If an error occurred, display the error. 
    e.printStackTrace(); 
    logger.debug("Request sent failed: " + e.getMessage() + "\n"); 
    } 
} 

Bạn cũng có thể xem các bài tham khảo về xác thực here. Dưới đây là các ý chính của nếu chỉ trong trường hợp liên kết khô-up một ngày:

Trong một yêu cầu SIP nếu máy chủ đáp ứng với 401 Proxy xác thực yêu cầu hoặc 401 trái phép sau đó nó có nghĩa là khách hàng có để phát lại cùng một yêu cầu một lần nữa với thử thách MD5.

Khách hàng nên sử dụng giá trị nonce từ tiêu đề phản hồi WWW-Authenticate.

WWW-Authenticate: Digest realm = "sip.linphone.org", nonce = "JbAO1QAAAAA3aDI0AADMobiT7toAAAAA", đục = "+ GNywA ==", thuật toán = MD5, QoP = "auth"

Các khách hàng nên sử dụng nonce để tạo ra các thách thức MD5 và thực hiện yêu cầu ban đầu lại với tiêu đề Authorization

bước để tạo MD5 Challenge

  1. tạo băm MD5 đầu tiên sử dụng username +. “:” + vương + “:” + mật khẩu

    Chuỗi a1 = tên người dùng + ":" + realm + ":" + mật khẩu; Chuỗi ha1 = toHexString (mdigest.digest (a1.getBytes()));

  2. Tạo băm MD5 thứ hai sử dụng REQUEST_METHOD + “:” + REQUEST_URI

    Chuỗi a2 = request_method.toUpperCase() + ":" + REQUEST_URI; Chuỗi ha2 = toHexString (mdigest.digest (a2.getBytes()));

  3. Nếu qop trong tiêu đề phản hồi là “auth” thì giá trị băm MD5 cuối cùng được tính bằng bước 3a nếu nó không được xác định hoặc tham chiếu trống 3b.

3a. Tạo chuỗi MD5 thức sử dụng ha1 + “:” + nonce + “:” + nonceCount + “:” + cNonce + “:” + QoP + “:” + HA2

String finalStr = ha1 + ":" + nonce + ":" + nonceCount + ":" + cNonce + ":" + qop + ":" + ha2; 
String response = toHexString(mdigest.digest(finalStr.getBytes())); 

3b. Tạo chuỗi thức MD5 sử dụng ha1 + “:” + nonce + “:” + HA2

String finalStr = ha1 + ":" + nonce + ":" + ha2; 
String response = toHexString(mdigest.digest(finalStr.getBytes())); 
+0

Khi tôi cố gắng sử dụng mã từ bài này, tôi nhận NPE dòng: 'ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port, "tcp", null); ' – skywalker

+0

@ johndaw16 là headerFactory của bạn null? Bạn phải tạo nó. Ví dụ: SipFactory sipFactory = SipFactory.getInstance(); sipFactory.setPathName ("gov.nist"); headerFactory = sipFactory.createHeaderFactory(); – 11101101b

+0

'ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port," tcp ", null)' Tham số cuối cùng phải là chuỗi branchID. Hãy thử nó theo cách đó. – Bobzone

2

Bạn cũng có thể muốn có một cái nhìn tại các lớp ClientAuthenticationHelper mà gói gọn các bước trên: Xem gov gói .nist.javax.sip.clientauthutils

Tôi tin rằng có một ví dụ về cách sử dụng trong cơ sở mã.