2010-10-24 28 views
8

ile HTTP özet kimlik doğrulaması Özetleme kimlik doğrulaması kullanarak makinemdeki Tomcat Web Sunucusu'na bağlanmaya çalışıyorum. Tomcat'in bellek alanını kullanıyorum.HttpUrlConnection

1) server.xml de: İşte sunucu yapılandırıldığı nasıl

<Realm className="org.apache.catalina.realm.MemoryRealm" digest="MD5" /> 

2) my web web.xml''deki olarak tomcat-users.xml

<user username="testuser" password="81dc9bdb52d04dc20036dbd8313ed055" roles="test"/> 

3) ise proje:

<auth-method>DIGEST</auth-method> 

ben bir özet yöntemi "MD5" olarak belirtilen ve ben Tom digest.sh kullanarak şifreyi encryped gelmiş görebileceğiniz gibi kedi. de benim istemci tarafı kod Tamam olduğunu düşünüyorum

private static void testGet() throws IOException { 

    // Create a URL 
    URL test = new URL("http://localhost:8080/TestWebProject/TestServlet"); 

    // Open a connection to the URL 
    HttpURLConnection conn = (HttpURLConnection) test.openConnection(); 

    MessageDigest md5 = null; 
    try { 
     md5 = MessageDigest.getInstance("MD5"); 
    } catch(NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 

    // Digest password using the MD5 algorithm 
    String password = "1234"; 
    md5.update(password.getBytes()); 
    String digestedPass = digest2HexString(md5.digest()); 

    // Set header "Authorization" 
    String credentials = "testuser:" + digestedPass; 
    conn.setRequestProperty("Authorization", "Digest " + credentials); 

    // Print status code and message 
    System.out.println("Test HTTP GET method:"); 
    System.out.println("Status code: " + conn.getResponseCode()); 
    System.out.println("Message: " + conn.getResponseMessage()); 
    System.out.println(); 

} 

private static String digest2HexString(byte[] digest) 
{ 
    String digestString=""; 
    int low, hi ; 

    for(int i=0; i < digest.length; i++) 
    { 
     low = (digest[i] & 0x0f) ; 
     hi = ((digest[i] & 0xf0)>>4) ; 
     digestString += Integer.toHexString(hi); 
     digestString += Integer.toHexString(low); 
    } 
    return digestString ; 
} 

ve sunucu konfigürasyonu:

İşte benim istemci tarafında koddur. Sunucu bana "Yetkisiz" mesajıyla durum kodu 401 göndermeye devam etmesine rağmen. Deneyimli bir java geliştiricisi olmadığımdan, benim uygulamamda herhangi birinin bir fikri olup olmadığı veya bir hata görüp görmediğini sormak istiyorum.

Teşekkürler!

+0

Genellikle, HTTP kimlik destekleyen istemci web tarayıcısını kapatana kadar "Çıkış" olmadığı için, HTTPS bağlantısı ve bazı standart HTML tabanlı kimlik doğrulama formu kullanmak daha iyi olabilir. – Kel

+0

Olası çoğaltılabilir [HttpURLConnection kullanarak Android'de özet kimlik doğrulaması] (http://stackoverflow.com/questions/32689185/digest-authentication-in-android-using-httpurlconnection) – ceph3us

cevap

5

Özet kimlik doğrulaması, yalnızca username:password göndermekten çok daha karmaşıktır (aslında Temel kimlik doğrulaması ... ve username:password kopyasının Base64 kodlanmış olması gerekir!).

here özetiyle ilgili tüm bilgileri okuyabilirsiniz.

Hem onlardan zaten desteği: Bu iki proje bakmak HttpUrlConnection kullanmak için gerekli değilseniz

Kutudan dışarı sindirmek (ve diğer yararlı şeyler).

2

HttpUrlConnection basit işler için sorun yok, ama (gibi kimlik doğrulama sindirmek) daha gelişmiş özelliklere sahip bir şey istiyorum, ben bunu şu kodu çalışma halletmek mümkün duyuyorum Commons HTTP Client.

4

öneriyoruz, lütfen bana bildirin eğer bir şey özlüyorsam;

 DefaultHttpClient httpclient = new DefaultHttpClient(); 

     ResponseHandler<String> responseHandler = new BasicResponseHandler(); 

     httpclient.getCredentialsProvider().setCredentials(
       new AuthScope("localhost", 8080), 
       new UsernamePasswordCredentials("username", "password")); 

     HttpGet httpget = new HttpGet(urlStr); 
     System.out.println("executing request" + httpget.getRequestLine()); 

     String response = httpclient.execute(httpget, responseHandler); 
     System.out.println("Response :: " + response); 
+0

Bence bu sorun değil. Neredeyse aynı kodu kullandım. – user485624

+0

DefaultHttpClient şimdi kullanımdan kaldırıldı ve HttpClient artık getCredentialsProvider yöntemine sahip değil ...herhangi birinin güncellenmiş bir örneği var mı? – Rafael

+0

Benim için çalıştı. Teşekkürler! – basari66

3

Aşağıdaki kodu kullanın, işe yarar. Özet kimlik doğrulama zorunlu değilse

import org.apache.http.auth.UsernamePasswordCredentials; 
import org.apache.http.client.CredentialsProvider; 
import org.apache.http.impl.client.CloseableHttpClient; 

CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     credsProvider.setCredentials(
       new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
       new UsernamePasswordCredentials(username, password)); 
     CloseableHttpClient httpclient = HttpClients.custom() 
       .setDefaultCredentialsProvider(credsProvider) 
       .build(); 


HttpResponse response = httpClient.execute(get); 
+4

Bağlam ve açıklama, bu soruna aynı sorunla karşılaşan gelecekteki kullanıcılar için yararlı olacaktır – StormeHawke

İlgili konular