2010-06-02 16 views
14

मूल रूप से मुझे जो करना है वह पाचन प्रमाणीकरण करने के लिए है। पहली चीज मैंने कोशिश की है आधिकारिक उदाहरण here उपलब्ध है।अपाचे एचटीपी क्लाइंट डाइजेस्ट प्रमाणीकरण

DefaultHttpClient client = new DefaultHttpClient(); 
client.getCredentialsProvider().setCredentials(new AuthScope(null, -1, null), new UsernamePasswordCredentials("<username>", "<password>")); 

HttpPost post = new HttpPost(URI.create("http://<someaddress>")); 
     List<NameValuePair> nvps = new ArrayList<NameValuePair>(); 
nvps.add(new BasicNameValuePair("domain", "<username>")); 
post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); 

DigestScheme digestAuth = new DigestScheme(); 
digestAuth.overrideParamter("algorithm", "MD5"); 
digestAuth.overrideParamter("realm", "http://<someaddress>"); 
digestAuth.overrideParamter("nonce", Long.toString(new Random().nextLong(), 36)); 
digestAuth.overrideParamter("qop", "auth"); 
digestAuth.overrideParamter("nc", "0"); 
digestAuth.overrideParamter("cnonce", DigestScheme.createCnonce()); 

Header auth = digestAuth.authenticate(new 
     UsernamePasswordCredentials("<username>", "<password>"), post); 
System.out.println(auth.getName()); 
System.out.println(auth.getValue()); 
post.setHeader(auth); 


HttpResponse ret = client.execute(post); 
ByteArrayOutputStream v2 = new ByteArrayOutputStream(); 
ret.getEntity().writeTo(v2); 
System.out.println("----------------------------------------"); 
System.out.println(v2.toString()); 
System.out.println("----------------------------------------"); 
System.out.println(ret.getStatusLine().getReasonPhrase()); 
System.out.println(ret.getStatusLine().getStatusCode()); 

सबसे पहले मेरे पास है: लेकिन जब मैंने उसे अमल करने की कोशिश (कुछ छोटे परिवर्तन के साथ, पोस्ट प्राप्त विधि के बजाय) मैं एक

org.apache.http.auth.MalformedChallengeException: missing nonce in challange 
at org.apache.http.impl.auth.DigestScheme.processChallenge(DigestScheme.java:132) 

जब यह विफल रहा है मैं का उपयोग कर की कोशिश की मिल केवल "क्षेत्र" और "nonce" DigestScheme पैरामीटर overridden। लेकिन यह पता चला कि सर्वर पर चल रहे PHP स्क्रिप्ट के लिए अन्य सभी पैराम की आवश्यकता है, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं उन्हें निर्दिष्ट करता हूं या नहीं, DigestScheme उन्हें प्रमाणीकरण अनुरोधप्रतिर्टी में उत्पन्न नहीं करता है जब मैं इसकी प्रमाणीकृत() विधि कहता हूं। और PHP स्क्रिप्ट HTTP संदेश कोड 200 को एक संदेश के साथ देता है कि PHP स्क्रिप्ट को cnonce, nc और qop पैरामीटर की आवश्यकता होती है।

मैं दो दिनों के लिए इस के साथ संघर्ष कर रहा है, और कोई भाग्य। सबकुछ के आधार पर मुझे लगता है कि समस्या का कारण PHP स्क्रिप्ट है। मुझे लगता है कि जब ऐप अनधिकृत पहुंचने का प्रयास करता है तो यह एक चुनौती नहीं भेजता है।

कोई भी विचार किसी को भी?

संपादित करें: एक और बात, मैं cURL के साथ जोड़ने की कोशिश की है और यह काम करता है।

+0

ऐसा लगता है कि सर्वर गैर-मानक चुनौतियों को भेज रहा है। क्या आप इसे ब्राउज़र में आज़मा सकते हैं और हेडर ट्रेस प्राप्त कर सकते हैं? –

+0

मैंने सर्वर पर एक HttpURLConnection बनाया है और प्रतिक्रिया शीर्षलेख मुद्रित किया है। नीचे एक चुनौती कैसी दिखती है: कुंजी = www-प्रमाणीकृत वैल्यू = डाइजेस्ट रीयलम = "रीस्ट एपीआई" कूप = "ऑथ" नॉन = "4c063992df3dd" opaque = "aba3d4b49c454e1974970e7b5514b001" – anqe1ki11er

उत्तर

3

मैं कोड की पुष्टि करने के बाद digestScheme का उपयोग कर लॉगिन एक डाइजेस्ट करने के लिए कामयाब रहे।

digestAuth.processChallenge(null); 

पिछले इनपुट पैरामीटर का अर्थ समझने के लिए मजबूर करता है। शून्य पैरामीटर हेडर भेजा गया है, यदि कोई हो, तो हेडर पर आधारित है।

अब qop/nc प्रयोग किया जाता है और digestScheme काम करता है के रूप में की आवश्यकता है। एंड्रॉयड

digestAuth.overrideParamter("algorithm", "MD5"); 
digestAuth.overrideParamter("realm", serverRealm); 
digestAuth.overrideParamter("nonce", Long.toString(new Random().nextLong(), 36)); 
digestAuth.overrideParamter("qop", "auth");// not effective 
digestAuth.overrideParamter("nc",""+sequence);//nt effective 
digestAuth.overrideParamter("cnonce", DigestScheme.createCnonce()); 
digestAuth.overrideParamter("opaque","ba897c2f0f3de9c6f52d"); 
String err; 
try 
{ 
    digestAuth.processChallenge(null); 
    //force qop in use chalange on return header ????!!!! 
} 
catch (Exception e) 
{ 
    err=e.getLocalizedMessage(); 
} 
+0

मैं प्रोग्राम को प्रोग्रामिक रूप से कैसे निर्धारित कर सकता हूं? यह कोड लाइब्रेरी के लिए है जो कई सर्वरों से कनेक्ट होने वाले कई कंप्यूटरों पर चलता है। तो मैं इसे कड़ी मेहनत नहीं कर सकता। –

-2

पर यह चल रहा है तुम लोग यह इतना जटिल बना। यदि आप apache httpclient के दस्तावेज़ को पढ़ते हैं, तो यह बहुत आसान होगा।

protected static void downloadDigest(URL url, FileOutputStream fos) 
    throws IOException { 
    HttpHost targetHost = new HttpHost(url.getHost(), url.getPort(), url.getProtocol()); 
    CloseableHttpClient httpClient = HttpClients.createDefault(); 
    HttpClientContext context = HttpClientContext.create(); 

    String credential = url.getUserInfo(); 
    if (credential != null) { 
     String user = credential.split(":")[0]; 
     String password = credential.split(":")[1]; 

     CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     credsProvider.setCredentials(AuthScope.ANY, 
      new UsernamePasswordCredentials(user, password)); 
     AuthCache authCache = new BasicAuthCache(); 
     DigestScheme digestScheme = new DigestScheme(); 
     authCache.put(targetHost, digestScheme); 

     context.setCredentialsProvider(credsProvider); 
     context.setAuthCache(authCache); 
    } 

    HttpGet httpget = new HttpGet(url.getPath()); 

    CloseableHttpResponse response = httpClient.execute(targetHost, httpget, context); 

    try { 
     ReadableByteChannel rbc = Channels.newChannel(response.getEntity().getContent()); 
     fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
    } finally { 
     response.close(); 
    } 
} 
1

यह कोड स्निपेट मेरे लिए काम करता है। आपको मेजबान से मिलने वाले 401 प्रतिक्रिया शीर्षलेख को देखकर आप जो क्षेत्र प्राप्त कर सकते हैं उसे प्रदान करना होगा।

val credsProvider = new BasicCredentialsProvider(); 
credsProvider.setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials(user, password)); 
val authCache = new BasicAuthCache(); 
val digestScheme = new DigestScheme(); 

digestScheme.overrideParamter("realm", "**Name of the Realm**"); 
// Nonce value 
digestScheme.overrideParamter("nonce", "whatever"); 

authCache.put(targetHost, digestScheme); 

context.setCredentialsProvider(credsProvider); 
context.setAuthCache(authCache); 

val httpget = new HttpGet(url); 

val response = httpClient.execute(targetHost, httpget, context); 
संबंधित मुद्दे