2013-02-05 15 views
5

मैं जावा एप्लिकेशन लिखने का प्रयास करता हूं जो ईमेल पढ़ने के लिए एक्सचेंज वेब सेवाओं तक पहुंचता है। इस प्रकार, मैं एक्सचेंज वेब सर्विसेज (EWS) माइक्रोसॉफ्ट द्वारा प्रदान की गई जावा एपीआई का उपयोग करता हूं।जावा में एक्सचेंज वेब सेवा कनेक्शन के लिए एलडीएपी प्रमाणीकरण का उपयोग कैसे करें?

I already had several issues with it, और अंततः मुझे पता चला कि प्रमाणीकरण एलडीएपी का उपयोग करके किया जाना चाहिए। दुर्भाग्य से, मुझे यकीन नहीं है कि ऐसी चीज कैसे करें। क्या ईडब्ल्यूएस एपीआई एक्सचेंज सर्वर से कनेक्ट करते समय उपयोग की जाने वाली प्रमाणीकरण योजना को कॉन्फ़िगर करने की अनुमति देता है? यदि हां, तो इसे कैसे कॉन्फ़िगर करें?

इस कोड मैं कनेक्शन के लिए उपयोग है, लेकिन यह डिफ़ॉल्ट प्रमाणीकरण योजना है, यानी NTLM उपयोग करता है:

String url = "https//my-server/EWS/exchange.asmx"; 
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 
service.setTraceEnabled(true); 
service.setCredentials(new WebCredentials("user", "password")); 
service.setUrl(url.toURI()); 

Mailbox mailbox = new Mailbox("[email protected]"); 
FolderId folder = new FolderId(WellKnownFolderName.Inbox, mailbox); 
ItemView view = new ItemView(10); 
view.getOrderBy().add(ItemSchema.DateTimeReceived, SortDirection.Descending); 
FindItemsResults<Item> items = service.findItems(folder, view); 

उत्तर

2

हम इस समस्या का समाधान। वास्तव में, हमारे पास इसके लिए 2 समाधान थे:

माइक्रोस्कोफ्ट ईडब्ल्यूएस एपीआई में, वर्ग NTLM गलत था। इसलिए हम वर्ग के लिए निम्न कोड के साथ जार फिर से बनाया गया:

private class NTLM { 
    /** Character encoding */ 
    public static final String DEFAULT_CHARSET = "ASCII"; 

    /** 
    * The character was used by 3.x's NTLM to encode the username and 
    * password. Apparently, this is not needed in when passing username, 
    * password from NTCredentials to the JCIFS library 
    */ 
    private String credentialCharset = DEFAULT_CHARSET; 

    void setCredentialCharset(String credentialCharset) { 
      this.credentialCharset = credentialCharset; 
    } 

    private static final int TYPE_1_FLAGS = NtlmFlags.NTLMSSP_NEGOTIATE_NTLM 
       | NtlmFlags.NTLMSSP_NEGOTIATE_UNICODE 
       | NtlmFlags.NTLMSSP_NEGOTIATE_NTLM2; 

    private String generateType1Msg(String host, String domain) { 
      jcifs.ntlmssp.Type1Message t1m = new jcifs.ntlmssp.Type1Message(
         TYPE_1_FLAGS, domain, host); 
      return jcifs.util.Base64.encode(t1m.toByteArray()); 
    } 

    private String generateType3Msg(String username, String password, 
       String host, String domain, String challenge) { 
      jcifs.ntlmssp.Type2Message t2m; 
      try { 
       t2m = new jcifs.ntlmssp.Type2Message(
           jcifs.util.Base64.decode(challenge)); 
      } catch (IOException e) { 
       throw new RuntimeException("Invalid Type2 message", e); 
      } 

      final int type2Flags = t2m.getFlags(); 
      final int type3Flags = type2Flags 
         & (0xffffffff^(NtlmFlags.NTLMSSP_TARGET_TYPE_DOMAIN | NtlmFlags.NTLMSSP_TARGET_TYPE_SERVER)); 

      jcifs.ntlmssp.Type3Message t3m = new jcifs.ntlmssp.Type3Message(
         t2m, password, domain, username, host, type3Flags); 
      return jcifs.util.Base64.encode(t3m.toByteArray()); 
    } 
} 

एक अन्य समाधान उपयोग करने के लिए JWebServices पुस्तकालय (वाणिज्यिक) है।

+0

मैंने इन निर्देशों का पालन किया और एनटीएलएम संशोधित किया और स्रोत से संकलित किया जैसा कि यहां वर्णित है और अभी भी वही त्रुटि संदेश प्राप्त हुए हैं। हम यहां जावामेल कार्यान्वयन का उपयोग करने पर बस गए, जिसने काम किया: http://stackoverflow.com/a/18043717/445131 –

+0

यह कक्षा EwsJCIFSNTLMScheme (एपीआई 1.2) में एक आंतरिक कक्षा है। – oers

0

हमारे पास एक ही समस्या थी और हालांकि एनटीएलएम वर्ग (रोमांटैज़ सुझाए गए अनुसार) को बदलना, यह किसी अन्य बिंदु पर तोड़ रहा था। https://github.com/OfficeDev/ews-java-api

अब यह Apache httpclient 4.4.1, एक अच्छा NTLM-कार्यान्वयन है जो प्रयोग करता है:

हालांकि, वहाँ GitHub पर EWS जावा पुस्तकालय, hostet के एक नए संस्करण है।

इस लाइब्रेरी का उपयोग करके, अब तक एनटीएलएम प्रमाणीकरण के संबंध में हमारे पास कोई और समस्या नहीं थी।

संबंधित मुद्दे