Jump to content

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo Peter,

 

überprüf mal, ob dir gleichen Werte auch so identisch am Server ankommen.

Ich tippe mal das da im Transportkanal irgendetwas "klemmt".

 

Axiom

Diesen Beitrag teilen


Link zum Beitrag
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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Case closed.

 

Die POST-Parameter müssen dem NSURLRequest als httpBody mitgegeben werden. 

 

Beste Grüße

Peter

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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"

Diesen Beitrag teilen


Link zum Beitrag
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]];

        }

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.


×
×
  • Neu erstellen...

Wichtige Information

Wir speichern Cookies auf Ihrem Gerät, um diese Seite besser zu machen. Sie können Ihre Cookie-Einstellungen anpassen, ansonsten gehen wir davon aus, dass Sie damit einverstanden sind. In unseren Datenschutzerklärungen finden sie weitere Informationen.