API Aufruf mit GET Request und HMAC

java666

Aktives Mitglied
Hallo,

ich versuche gerade einen API-Client zu programmieren. Das erste Java-Programm seit ca. 8 Jahren.
Eigentlich ist das ganze gar nicht so wirklich schwer, aber leider bin ich jetzt an einem Punkt wo meine Java Kenntnisse am ende sind.
Das Problem ist das ich einen GET-Request an die API schicke, ohne einen GET Body.
Jetzt kann man aber leider den HMAC(SHA256) Hash nicht richtig erstellen weil man dazu ja einen SecretKey benötigt, dieser SecretKey kann aber leider nicht bei einem GET-Request mit übermittelt werden, zumindest nicht in Java(oder besser gesagt, ich nicht).
In PHP kann man die HASH_HMAC einfach ohne ein Secret-Key aufrufen und der Hmac Hash wird trotzdem erstellt. Auch könnte ich in PHP per cUrl einfache einen Customheader für GET erstellen und somit auch den Secret-Key an die API senden.
Hier mal der Code der für den API Aufruf zuständig ist.
Java:
private String apiCall( String domain, String publicHash, String privateHash ) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpGet httpget = new HttpGet(domain);
        String secret = "[]";
        httpget.addHeader("Accept", "application/json");
        httpget.addHeader("Content-Type", "application/json");
        httpget.addHeader("Public", publicHash);
        ApiSecurity privateKey = new ApiSecurity();
        privateKey.setPrivateKey(privateHash, secret);
        //System.out.println(privateKey.getPrivateKey());
        httpget.addHeader("Hash", privateKey.getPrivateKey());
        CloseableHttpResponse response = null;
        try {
            response = httpclient.execute(httpget);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        BufferedReader rd = null;
        try {
            rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        } catch (UnsupportedOperationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        StringBuffer result = new StringBuffer();
        String line = "";
        try {
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        return result.toString();
    }

Hier noch der Code der zuständig ist für die Erstellung des Hmac-Hash
Java:
package API_Client;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;


public class ApiSecurity {
   
    String privateKey = null;

    public void setPrivateKey( String key, String secret) {
        Mac hashHmac = null;
        String algorythmus = "HmacSHA256";
        try {
            hashHmac = Mac.getInstance(algorythmus);
            SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), algorythmus);
            try {
                hashHmac.init(secretKey);
                this.toHexString(hashHmac, key);
            } catch (InvalidKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
    }
   
    public String getPrivateKey() {
        return privateKey;
    }
   
    private void toHexString( Mac hashObj, String key ) {
        String temp = "";
        byte[] digest = hashObj.doFinal(key.getBytes());
        for (byte b : digest) {
            temp += String.format("%02x", b);
        }
       
        privateKey = temp;
       
    }
   
}
Wenn ich den Hmac-Hash in PHP erstellen lasse und in dann in der Methode hinterlege liefert die API auch schon die Daten.
Vllt habt ihr ja eine Idee was ich machen könnte damit der Key ohne Secret-Key erstellt wird oder ich den Secret-Key auch bei einem GET-Request mitsenden kann.

Ich hoffe das Problem ist ersichtlich und genau beschrieben.

Vielen dank jetzt schon einmal für eure Hilfe und Zeit dir ihr euch nehmt.
 

mrBrown

Super-Moderator
Mitarbeiter

java666

Aktives Mitglied
Ich habe es schon einmal mit dem addHeader versucht. Leider ohne erfolg.
Jetzt hab ich aber tatsächlich heute in der früh zumindest eine Teillösung für das Problem gefunden.
Java:
private String apiCall( String domain, String publicHash, String privateHash ) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpPost httpget = new HttpPost(domain);
        String secret = "[]";
        httpget.addHeader("Accept", "application/json");
        httpget.addHeader("Content-Type", "application/json");
        httpget.addHeader("Public", publicHash);
        ApiSecurity privateKey = new ApiSecurity();
        System.out.println( privateHash );       
        privateKey.setPrivateKey(privateHash, secret);
        System.out.println(privateKey.getPrivateKey());
        httpget.addHeader("Hash", privateKey.getPrivateKey());
        StringEntity xmlEntity = null;
        try {
            xmlEntity = new StringEntity(secret);
        } catch (UnsupportedEncodingException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        httpget.setEntity(xmlEntity);
        httpget.addHeader("X-HTTP-Method-Override", "GET");
        CloseableHttpResponse response = null;
        try {
            response = httpclient.execute(httpget);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        BufferedReader rd = null;
        try {
            rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        } catch (UnsupportedOperationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        StringBuffer result = new StringBuffer();
        String line = "";
        try {
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        return result.toString();
    }

Ich sende jetzt einen POST-Request der ja einen Body haben kann. Und überschreibe dann den POST-Header mit:
httpget.addHeader("X-HTTP-Method-Override", "GET");
Jetzt kommt an der API zwar eigentlich ein POST an aber dank diesem Header wird dann die GET Methode verwendet.
Jetzt habe ich aber immer noch ein Problem mit dem Hash-Wert.
Ich bekomme verschiedene Hash-Werte geliefert:
Key: gQNHOfl0tlKRA8vuTnxzyDlX8TMITafUqiHin9l7kyW18UpG7q5Intds
PHP: e79cfd621c5db54b5c88e85cd8ab3609b303a3db120f6d12f8523b4fde12f3f4
Java: aeee73f07e696ee524b9c8292b2062d60a322e9414a107f9da8ce0ede1e01ebc

PHP Code zum erstellen
PHP:
$data = json_encode(
    array()
);

$privateHash = 'gQNHOfl0tlKRA8vuTnxzyDlX8TMITafUqiHin9l7kyW18UpG7q5Intds';
echo hash_hmac('sha256', $data, $privateHash);

Java:
public void setPrivateKey( [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] key, [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] secret) {
        Mac hashHmac = null;
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] algorythmus = "HmacSHA256";
        try {
            hashHmac = Mac.getInstance(algorythmus);
            SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), algorythmus);
            try {
                hashHmac.init(secretKey);
                this.toHexString(hashHmac, key);
            } catch ([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+invalidkeyexception']InvalidKeyException[/URL] e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch ([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+nosuchalgorithmexception']NoSuchAlgorithmException[/URL] e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
    }

Vielleicht hat hierfür noch jemand eine Idee?
 

java666

Aktives Mitglied
Hallo,

ich habe es jetzt geschafft das ein Hmac Hash erstellt wird.
Java:
String secret = "[]";
wurde zu
String secret = privateHash;
Mit dieser Änderung geht es jetzt. Allerdings kann ich nicht sagen warum. Vllt hat ja dafür noch jemand eine Erklärung?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M SocketError bei Aufruf eines SOAP-Servers Netzwerkprogrammierung 8
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
OnDemand API Aufruf besser steuern, wie Fehler vermeiden Netzwerkprogrammierung 20
B Daten an Javaprogramm per URI Aufruf übergeben Netzwerkprogrammierung 7
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
C ObjectInputReader wirft beim zweiten Aufruf eine Exception Netzwerkprogrammierung 3
eLogic Internetseiten-Aufruf simulieren Netzwerkprogrammierung 16
Dit_ RMI RMI-Server und gleichzeitiger Aufruf einer Methode Netzwerkprogrammierung 14
G RMI Server starten - rmiregistry Aufruf? Netzwerkprogrammierung 17
D RMI Aufruf und danach Datenbank ? Netzwerkprogrammierung 10
C RMI: Problem beim Aufruf einer Methode. Falsch gecastet? Netzwerkprogrammierung 8
reibi Proxy macht Problem abeim URL-Aufruf Netzwerkprogrammierung 3
B Servlet URL aufruf Netzwerkprogrammierung 4
B Url aufruf über Proxy Netzwerkprogrammierung 2
Thallius HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen? Netzwerkprogrammierung 6
O HTTP Wer hilft mit meinem UTF-8 http Request ? Netzwerkprogrammierung 1
M HTTP PATCH Request mit Java ausführen Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
M http request and response Netzwerkprogrammierung 0
J Json von Html request einlesen Netzwerkprogrammierung 0
T curl request in java umwandeln Netzwerkprogrammierung 4
S PUT-Request Netzwerkprogrammierung 0
P Java Deauth / Deauthentication request Netzwerkprogrammierung 10
C Android: Json-POST Request zu REST Webservice Netzwerkprogrammierung 2
R Seltsames Verhalten bei GET Request Netzwerkprogrammierung 7
Y HTTP No request data found Netzwerkprogrammierung 2
B Socket HTTP-Request führt zu Endlosschleife Netzwerkprogrammierung 5
B Post Request in Java Netzwerkprogrammierung 11
D OT JavaScript JQuery AJAX Request Netzwerkprogrammierung 2
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
O Http request Netzwerkprogrammierung 7
T HTTP POST Request Netzwerkprogrammierung 3
E HTTP Request? Netzwerkprogrammierung 4
L Body eines http Request auslesen Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
D http request Netzwerkprogrammierung 11
ARadauer POST Request absetzen.. Netzwerkprogrammierung 3
J GET Request Netzwerkprogrammierung 1
hdi POST Request (HttpConnection) Netzwerkprogrammierung 6
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
J 403 error bei POST request Netzwerkprogrammierung 3
G auf http-request antworten. Netzwerkprogrammierung 3
G JMS Objektzugriff Request Reply erzeugt lediglich Kopie Netzwerkprogrammierung 4
L Java HTTP Request Netzwerkprogrammierung 3
S HTTP Request erstellen Netzwerkprogrammierung 2
K Bad Request nach Form Login in Jakarta HttpClient Netzwerkprogrammierung 4
B lange Strings in http-Request? Netzwerkprogrammierung 3
M erst POST dann Http-Request über URLConnection Netzwerkprogrammierung 3
m@nu Ende von Stream bei HTTP-Request Netzwerkprogrammierung 3
D HTTP Request erstellen (Form Name übergeben!) Netzwerkprogrammierung 3
P Easy Http Request Netzwerkprogrammierung 9
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
J HTTP-POST-Request mit Anhang über Socket Netzwerkprogrammierung 2
Z HTTP Request Netzwerkprogrammierung 3
A http request per socket an apache server Netzwerkprogrammierung 5
M Ein HTTP-request aus Java heraus senden Netzwerkprogrammierung 3
J HTTP Request Netzwerkprogrammierung 2
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
C dhcp request Netzwerkprogrammierung 16
D Bad Request bei Dateiload Netzwerkprogrammierung 2
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2
G Http Request Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben