#java #authentication #hash #httpurlconnection
#java #аутентификация #хэш #httpurlconnection
Вопрос:
Я получаю 401 при втором запросе на сторонний URL-адрес, хотя я следовал рекомендациям по дайджесту аутентификации для создания второго запроса. Это довольно упрощенный код, потому что я не очень хорошо разбираюсь в этом, но я думаю, что это близко. Мы застряли с использованием Java 1.7. Я пытался использовать HttpClient, но продолжал получать сброс соединения. Я продвигаюсь дальше с HttpURLConnection (теперь получаю 401 и заголовок WWW-Authenticate), но я не могу пройти мимо второго запроса.
\Building body of request
String bodydata = URLEncoder.encode("apikey", "UTF-8") "=" URLEncoder.encode("somekey", "UTF-8");
bodydata = "amp;" URLEncoder.encode("format", "UTF-8") "=" URLEncoder.encode("JSON", "UTF-8");
//print out the JSON search request
data.addToLog("JSONSearchRequest",bodydata.toString());
try {
URL myurl = new URL(null, baseurl , new sun.net.www.protocol.https.Handler() );
SSLContext sc = SSLContext.getInstance("TLSv1.2"); //$NON-NLS-1$
sc.init(null, null, new java.security.SecureRandom());
HttpsURLConnection con = (HttpsURLConnection )myurl.openConnection();
con.setSSLSocketFactory(sc.getSocketFactory());
//con.setSSLSocketFactory(new TSLSocketConnectionFactory());
con.setRequestProperty("username", userName);
con.setRequestProperty("nonce", "12345" ); //nonce64
con.setRequestProperty("realm", "some realm.");
con.setRequestProperty("algorithm", "MD5");
con.setRequestProperty("qop", "auth");
con.setRequestProperty("nc", "1");
con.setRequestProperty("uri", "/studio_instance/studio-api/v1/auth/get-token/");
con.setRequestProperty("Cookie", "some cookie value");
con.setRequestMethod(method);
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/json;charset=utf-8");
OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
out.write(bodydata);
out.flush();
out.close();
if (con != null){
con.setReadTimeout(60 * 1000);
data.addToLog("Response Code= ", con.getResponseCode() ": " con.getResponseMessage());
}
for (String header : con.getHeaderFields().keySet()) {
if (header != null) {
for (String value : con.getHeaderFields().get(header)) {
//System.out.println(header ":" value);
if (auth == null) {
data.addToLog("WWWauthenticateHeader :: " ,"is blank");
} else {
//for (String header : auth) {
String[] assetClasses = auth.split(","); // print [Equity, Gold, FixedIncome, Derivatives] System.out.println(Arrays.toString(assetClasses));
realm2=assetClasses[0]; realm2=realm2.substring(realm2.indexOf("=") 1); realm2=realm2.replace(""", ""); qop2=assetClasses[1]; qop2=qop2.substring(qop2.indexOf("=") 1); qop2=qop2.replace(""", ""); nonce2=assetClasses[3]; nonce2=nonce2.substring(nonce2.indexOf("=") 1); nonce2=nonce2.replace(""", ""); opaque2=assetClasses[4]; opaque2=opaque2.substring(opaque2.indexOf("=") 1); opaque2=opaque2.replace(""", "");
}
}
}
}
// the first call ALWAYS fails with a 401
String bodydata2 = URLEncoder.encode("apikey", "UTF-8") "=" URLEncoder.encode("someapikey", "UTF-8");
bodydata2 = "amp;" URLEncoder.encode("format", "UTF-8") "=" URLEncoder.encode("JSON", "UTF-8");
//print out the JSON search request
try {
URL myurl2 = new URL(null, baseurl , new sun.net.www.protocol.https.Handler() );
SSLContext sc2 = SSLContext.getInstance("TLSv1.2"); //$NON-NLS-1$
data.addToLog("URL2",myurl2.toString());
sc2.init(null, null, new java.security.SecureRandom());
HttpsURLConnection con2 = (HttpsURLConnection )myurl2.openConnection();
con2.setSSLSocketFactory(sc2.getSocketFactory());
MessageDigest md5 = null;
try{
md5 = MessageDigest.getInstance("MD5");
}
catch(NoSuchAlgorithmException e){
return null;
}
StringBuilder sbha1 = new StringBuilder();
sbha1.append(userName).append(":").append(realm2).append(":").append(password);
String ha1string = sbha1.toString();
md5.reset();
md5.update(ha1string.getBytes("ISO-8859-1"));
byte[] ha1bytes = md5.digest();
ha1 = Hex.encodeHexString(ha1bytes);
StringBuilder sbha2 = new StringBuilder();
sbha2.append("GET").append(":").append("path");
String ha2string = sbha2.toString();
md5.reset();
md5.update(ha2string.getBytes("ISO-8859-1"));
byte[] ha2bytes = md5.digest();
ha2 = Hex.encodeHexString(ha2bytes);
StringBuilder sbha3 = new StringBuilder();
sbha3.append(ha1).append(":").append(nonce2).append(":").append(ha2);
String ha3string = sbha3.toString();
md5.reset();
md5.update(ha3string.getBytes("ISO-8859-1"));
byte[] ha3bytes = md5.digest();
ha3 = Hex.encodeHexString(ha3bytes);
con2.setRequestProperty("Content-Type", "application/json;charset=utf-8");
StringBuilder sb2 = new StringBuilder(128);
sb2.append("Digest ");
sb2.append("username").append("="").append(userName).append("", ");
sb2.append("realm").append("="").append(realm2).append("", ");
sb2.append("nonce").append("="").append(nonce2).append("", ");
sb2.append("uri").append("="").append(path).append("", ");
sb2.append("qop").append("="").append(qop2).append("", ");
sb2.append("nc").append("="").append("1").append("", ");
sb2.append("cnonce").append("="").append("12345").append(""");
sb2.append("response").append("="").append(ha3).append(""");
sb2.append("opaque").append("="").append(opaque2).append("", ");
//sb2.append("algorithm").append("="").append("MD5").append(""");
digestAuthStr = sb2.toString();
con2.setRequestProperty("Authorization", digestAuthStr);
con2.setRequestMethod("GET");
con2.setDoOutput(true);
OutputStreamWriter out2 = new OutputStreamWriter(con2.getOutputStream());
out2.write(bodydata2);
out2.flush();
out2.close();
if (con2 != null){
con2.setReadTimeout(60 * 1000);
}
Комментарии:
1. я думаю, вам нужно закодировать значение при настройке ключа «Авторизация»?
2. con.setRequestProperty(«имя пользователя», userName); con.setRequestProperty(«одноразовый номер», «12345»); // nonce64? закодируйте n, затем установите.
3. Я добавил ниже, но он по-прежнему не работает: md5.reset(); md5.update(digestAuthStr.getBytes(«ISO-8859-1»)); byte[] digestAuthbytes = md5.digest(); digestAuthFinal = Hex.encodeHexString(digestAuthbytes); data.addToLog(«digestAuthFinal»,digestAuthFinal);
4. используйте кодировку base64