Zum Inhalt springen

Invalid Signature bei POST-Requests (Bitcoin.de API)


cocoahead

Empfohlene Beiträge

Hallo zusammen,

 
derweil entwickle ich eine App für macOS, um mithilfe der API traden zu können.
 
Reine GET- und DELETE-Anfragen, d.h. showRates, showOrderbook, showMyOrders usw. und auch remove_order, funktionieren auch schnell und zuverlässig. Lediglich mit den POST-Anfragen erhalte ich stets einen Invalid-Signature-Fehler (Error code 5).
 
Zum Vergleich zog ich eine php-Implementation der Bitcoin.de-API heran: mit ihr habe ich keine Schwierigkeiten, neue Order (createOrder) anzulegen. 
 
Gebe ich nun sowohl der php- als auch meiner Implementation zur Berechnung der Signatur die identischen Werte (apiKey, apiSecret, identische nonce, identische Parameter für die zu erzeugende Order) vor, erhalte ich auch exakt gleiche Werte für hash und hmac. 
 
Dies ist für mich etwas irritierend - identische Ausgangswerte ergeben identisch Ergebnisse der Berechnungen ergeben unterschiedliche Serverantworten … 
 
Etwas ratlos frage ich hier freundlich in die Runde, ob irgendwer mal über ähnliche Probleme stolperte. 
 
Beste Grüße
Peter
Bearbeitet von cocoahead
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Axoim,

 

vielen Dank für deine schnelle Antwort. In die Richtung hatte ich auch überlegt - und augenscheinlich kann es ja fast nichts™ anderes mehr sein - wenngleich mich das wundert. Ich nutze für GET/DELETE/POST die identische Methode zum Erstellen des urlRequests: straight forward ein Request-Object holen und Werte setzen und dann via NSURLSession absenden.

 

Mal schauen, was ich herausfinden kann. 

 

Beste Grüße

Peter

 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:httpMethod];

[request addValue:api_key forHTTPHeaderField:@"X-API-KEY"];

[request addValue:nonce   forHTTPHeaderField:@"X-API-NONCE"];

[request addValue:hmac    forHTTPHeaderField:@"X-API-SIGNATURE"];

Bearbeitet von cocoahead
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...

Hey, ich stehe vor selbigen Problem. Allerdings mit einer etwas anderen methode.

Einen GET Request zu senden wie den Kurs abzufragen funktioniert. Nur leider bei Post Parameter stoße ich auf Probleme. Dort erhalte ich selbige Fehlermeldung. Ich denke auch das irgendwas bei mir noch fehlt.

Zum testen der Paramter habe ich das folgende Beispiel genau nachberechnet. sowohl der codierte MD5 Post parameter sowie auch die Signatur stimmen mit dem Beispiel überein. In der Logdatei auf Bitcoin.de kann ich sehen das der Request zwar ankommt, der Postparameter jedoch nicht mit übergeben wird. Das ist wohl das derzeitige Problem bei mir. Fehlt mit bei der Übergabe vielleicht noch hein Header?

POST-Parameter:
{
    'type'     : 'buy',
    'max_amount' : 5.3,
    'price'   : 255.50
}

api_key:     'MY_API_KEY' // Entspricht dem eigenen API-Key
nonce:       1234567 // Das für den aktuellen Request verwendete Nonce
api_secret:  'MY_API_SECRET' // Entspricht dem eigenen API-Secret
http_method: 'POST'
uri:         'https://api.bitcoin.de/v1/orders'

Schritt 1: Aufsteigendes Sortieren der POST-Parameter anhand ihres Namens¹

{
    'max_amount' : 5.3,
    'price'   : 255.50
    'type'     : 'buy',
}

Schritt 2: Einen validen URL-encoded Query-String aus den POST-Parametern generieren¹

url_encoded_query_string = 'max_amount=5.3&price=255.5&type=buy'

Schritt 3: md5-Hash über den in Schritt 2 erstellten Query-String der POST-Parameter bilden

post_parameter_md5_hashed_url_encoded_query_string = md5(url_encoded_query_string) // Es wird der MD5-Hash in hexadezimaler Form benötigt
=> '5f4aece1d75c7adfc5ef346216e9bb11'

Schritt 4: Konkatinieren der HMAC-Eingabedaten

hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+post_parameter_md5_hashed_url_encoded_query_string
=> 'POST#https://api.bitcoin.de/v1/orders#MY_API_KEY#1234567#5f4aece1d75c7adfc5ef346216e9bb11'

Schritt 5: Bilden des eigentlichen sha256-HMACs

hmac = HMAC('sha256', hmac_data, api_secret)
=> 'fd7c4c3af90524af1723bf89773904f87afdeaab2b87161799ee65f864aa9e96'

Die Übergabe erfolgt per HTTP5.1 Request. Wie gesagt der MD5 Hash sowie die SHA256 verschlüsslung liefern exakt das richtige Ergebnis. Entweder muss der url_encoded_query_string irgendwie noch in die ansteuernde URL eingebunden werden oder sonst was. Im Beispiel für GET Parameter muss es nämlich so gemacht werden. Aber auch dieser Versuch ergab keinen Erfolg.

Als Header werden bei POST die entsprechenden Parameter dem Header übergeben. Bei GET Funktioniert alles. Was fehlt mir noch?

RequestHeader "X-API-KEY"
RequestHeader "X-API-NONCE"
RequestHeader "X-API-SIGNATURE"

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie angesprochen, müssen die Postparameter als httpBody übergeben werden.

Hilft das?

 

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

        [request setHTTPMethod:httpMethod];

        [request addValue:api_key           forHTTPHeaderField:@"X-API-KEY"];

        [request addValue:nonce             forHTTPHeaderField:@"X-API-NONCE"];

        [request addValue:hmac              forHTTPHeaderField:@"X-API-SIGNATURE"];

        if (postParametersString.lenght > 0

            && [httpMethod isEqualToString:HTTPMethodPOSTKey]) {

            [request setHTTPBody:[postParametersString dataUsingEncoding:NSUTF8StringEncoding]];

        }

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.