Дайджест аутентификации Java HttpURLConnection получает 401

#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