cocoahead Geschrieben 7. April 2017 Teilen Geschrieben 7. April 2017 (bearbeitet) 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 8. April 2017 von cocoahead Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Axiom0815 Geschrieben 7. April 2017 Teilen Geschrieben 7. April 2017 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
cocoahead Geschrieben 8. April 2017 Autor Teilen Geschrieben 8. April 2017 (bearbeitet) 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 8. April 2017 von cocoahead Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
cocoahead Geschrieben 10. April 2017 Autor Teilen Geschrieben 10. April 2017 Case closed. Die POST-Parameter müssen dem NSURLRequest als httpBody mitgegeben werden. Beste Grüße Peter 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stevehackman Geschrieben 2. Mai 2018 Teilen Geschrieben 2. Mai 2018 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 Mehr Optionen zum Teilen...
cocoahead Geschrieben 2. Mai 2018 Autor Teilen Geschrieben 2. Mai 2018 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 Mehr Optionen zum Teilen...
Empfohlene Beiträge
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 erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden