2012-03-02 10 views
12

मैं HTTP क्लाइंट पर एक आरईएसटी एक्सेस करने का प्रयास करने के लिए HTTP क्लाइंट संस्करण 4.1.2 का उपयोग कर रहा हूं जिसके लिए मूल प्रमाणीकरण की आवश्यकता है।बेसिक एथ का उपयोग करते समय HTTP क्लाइंट दो अनुरोध भेजता है?

DefaultHttpClient httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager()); 
// Enable HTTP Basic Auth 
httpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
    new UsernamePasswordCredentials(this.username, this.password)); 

HttpHost proxy = new HttpHost(this.proxyURI.getHost(), this.proxyURI.getPort()); 

httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy); 

जब मैं एक POST अनुरोध का निर्माण, इस तरह::

HttpPost request = new HttpPost("http://my/url"); 
request.addHeader(new BasicHeader("Content-type", "application/atom+xml; type=entry")); // required by vendor 
request.setEntity(new StringEntity("My content")); 

HttpResponse response = client.execute(request); 

मैं Charles Proxy में देख दो अनुरोध भेजा जा रहा है देखते हैं कि यहाँ ग्राहक कोड है। Authorization: Basic ... शीर्षलेख के बिना एक और के साथ। पहले एक, एक 401 के साथ विफल हो के रूप में आप उम्मीद करेंगे, लेकिन दूसरे के साथ ठीक माध्यम से चला जाता है एक 201

किसी को भी पता है कि ऐसा क्यों होता? धन्यवाद!

संपादित करें:

मैं स्पष्ट कर दिया कि मैं पहले से ही this question पर ध्यान दिया है बनाना चाहिए, लेकिन जैसा कि आप देख सकते हैं मैं AuthScope उसी तरह सेट और यह मेरी समस्या का समाधान नहीं किया। इसके अलावा, मैं एक नई HttpClient हर बार जब मैं एक अनुरोध किया (हालांकि मैं एक ही ConnectionManager का उपयोग करें) बनाने रहा हूँ, लेकिन यहां तक ​​कि अगर मैं एक से अधिक अनुरोध के लिए एक ही HttpClient उपयोग करते हैं, समस्या अभी भी बनी हुई है।

संपादित करें 2:

तो यह लग रहा है क्या @LastCoder सुझाव दे रहा था तरीके से करना है की तरह। this answer को दूसरे प्रश्न पर देखें। समस्या HTTP spec के आसपास ज्ञान की कमी से उत्पन्न होती है। जो मैं करना चाहता हूं उसे "प्रीपेप्टिव प्रमाणीकरण" और HttpClientdocs mention it here कहा जाता है। शुक्र है, उपरोक्त से जुड़ा उत्तर यह करने के लिए एक बहुत छोटा और साफ तरीका है।

+1

मैं एक ही बात है जब साबुन-ui का उपयोग कर eventhough क्रेडेंशियल्स निर्दिष्ट किया गया हो रहा देखा। – Harindaka

+0

मुझे आश्चर्य है कि यह वास्तव में सामान्य व्यवहार है या नहीं। क्लाइंट एक http अनुरोध करता है कि वह कोई लेख नहीं मानता है और फिर उसे बताया जाता है (401 के माध्यम से) कि मूल लेख की आवश्यकता है। सिद्धांत रूप में बुनियादी लेख को पूर्ववत किया जा सकता है लेकिन अन्य लेख योजनाओं (पूर्व पाचन) को अतिरिक्त बातचीत की आवश्यकता है – seand

+0

@seand आप जानते हैं कि मैंने वास्तव में इसे माना है, लेकिन मुझे नहीं पता कि यह HTTP प्रोटोकॉल या ऐसा कुछ है या नहीं। – daveslab

उत्तर

10

बल्कि .setCredentials का उपयोग कर() क्यों तुम सिर्फ सांकेतिक शब्दों में बदलना नहीं है USERNAME से: पासवर्ड और .addHeader() के साथ प्रमाणीकरण शीर्ष लेख

+0

मैं यह कर सकता हूं, निश्चित रूप से, और मैं यह देखने के लिए परीक्षण करूंगा कि इससे कोई फर्क पड़ता है, लेकिन 'HttpClient' repo में उदाहरण कोड (http://bit.ly/wEsEhY) के अनुसार, मुझे ऐसा करना चाहिए यह। – daveslab

+7

@daveslab - यह संसाधन क्लाइंट के नाम से पहले अनुरोध करने के लिए http क्लाइंट spec का हिस्सा है और प्राधिकरण शीर्षलेख के साथ 401 का जवाब देता है। यदि यह ग्राहक नहीं थे तो वेब सर्वर को प्राधिकरण शीर्षलेख प्रमाण-पत्रों के साथ स्पैम करना होगा, वेब सर्वर को भी इसकी आवश्यकता नहीं है। यह सिर्फ बुनियादी सुरक्षा सर्वोत्तम अभ्यास है। –

+0

यह एक ब्रूट-फोर्स समाधान है लेकिन यदि आवश्यक हो तो प्रोटोकॉल स्विच करना मुश्किल हो जाएगा (उदा। अगर सर्वर डाइजेस्ट ऑथ का उपयोग करने के लिए बदल गया है) – seand

2

इसका मतलब यह है कि आपके सर्वर/लक्ष्य endpoint हर लिए एक नया सत्र पैदा कर रही है ग्राहक अनुरोध यह आपके हाथों के हिसाब से जाने के हर अनुरोध को मजबूर करता है, जिसका अर्थ है कि ग्राहक पहले कॉल करते हैं और महसूस करते हैं कि इसे प्राधिकरण की आवश्यकता है, फिर यह प्राधिकरण के साथ आता है। आपको क्या करना है प्राधिकरण को पूर्ववत रूप से निम्नानुसार भेजना है:

httpClient.getParams()। सेट प्रमाणीकरण पूर्वावलोकन (सत्य);

प्रक्रिया को समझने के लिए आप अपने क्लाइंट अनुरोध हेडर लॉग कर सकते हैं, ताकि आपको यह पता चल सके कि आपका ग्राहक क्या भेज रहा है और प्राप्त कर रहा है: देखें कि यह काम करता है या नहीं।

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