Parameter in Header bei Webrequest, REST-API Bittrex

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von harmenrabb.

    Parameter in Header bei Webrequest, REST-API Bittrex

    Hallo,

    ich stehe gerade vor einem Problem, dass ich zur Nutzung der API-Schnittstelle (REST) der Kryptobörse Bittrex da bei Funktionen, die eine Authentifizierung benötigen (z.B. Guthaben seines Accounts abfragen oder Trades setzen) da beim Web Request einen Hash im Header mitschicken muss.

    Beschrieben ist das ganze bei denen nur sehr kurz mit einem Code-Beispiel in php:
    support.bittrex.com/hc/en-us/a…-Guide-API#authentication

    Einen API-Key sowie das dazugehörige API-Secret habe ich mir im meinem Account erstellt (der den ich weiter unten in meinem Code stehen habe ist der reale, allerdings ist der Key nur auf Lesen geschaltet und selbst wenn es nicht so wäre ist auf dem Account eh nicht viel zu holen)

    Soweit ich das verstehe muss ich an die URL bzw URI die Parameter API-Key und Nonce anhängen, wobei Nonce ein Unix-Zeitstempel bezogen auf UTC-Zeit ist (dafür habe ich mir eine Funktion Zeit gebaut):

    VB.NET-Quellcode

    1. 'gibt den Unix-Zeitstempel zur UTC-Zeit zurück
    2. Public Function Time() As Integer
    3. Dim spanne As TimeSpan = DateTime.UtcNow - #1/1/1970#
    4. Return CType(Math.Abs(spanne.TotalSeconds()), Integer)
    5. End Function


    Diese komplette URI muss ich mit dem API-Secret als Schlüssel HMAC SHA 256 verschlüsseln, dafür habe ich mir auch eine Funktion gebaut:

    VB.NET-Quellcode

    1. 'verschlüsselt und konvertiert einen String in HMAC SHA256
    2. Public Function StringToHMACSHA256(sData As String, sKey As String) As String
    3. Dim SHA As New HMACSHA256
    4. SHA.Key = System.Text.Encoding.Default.GetBytes(sKey)
    5. SHA.ComputeHash(System.Text.Encoding.Default.GetBytes(sData))
    6. Dim Rückgabe As String = BitConverter.ToString(SHA.Hash)
    7. 'Bindestriche zwischen den einzelnen Bytes entfernen und die Buchstaben des Hex-Codes in kleine umwandeln
    8. Rückgabe = Replace(Rückgabe, "-", "")
    9. Rückgabe = Rückgabe.ToLower
    10. StringToHMACSHA256 = Rückgabe
    11. End Function


    Und diese Hashsignatur muss ich als Header "apisign" beim Webrequest hinzufügen. Meine komplette Funktion sieht dafür dann so aus am Beispiel des Befehls getbalances:

    VB.NET-Quellcode

    1. Public Function Bittrex_API_URL(URL As String) As String
    2. 'zum testen:
    3. API_KEY = "037e7a76d6d0480a90801fbe1e31a298"
    4. API_Secret = "83774e73cd6b4f75b45ef863657eef63"
    5. Dim URI As String = URL & "?apikey=" & API_KEY & "&nonce=" & Time()
    6. Debug.Print(URI)
    7. Dim Sign = StringToHMACSHA256(URI, API_Secret)
    8. Debug.Print(Sign)
    9. Dim request As WebRequest
    10. request = WebRequest.Create(URL)
    11. Dim response As WebResponse
    12. request.Method = "GET"
    13. request.Headers.Add("apisign:" & Sign)
    14. response = request.GetResponse()
    15. Dim reader As New StreamReader(response.GetResponseStream())
    16. Dim streamText As String = reader.ReadToEnd()
    17. Bittrex_API_URL = streamText
    18. End Function
    19. Public Sub SetAccount()
    20. ''Abfrage Balances
    21. Dim API_URL As String = "https://bittrex.com/api/v1.1/account/getbalances"
    22. 'Debug.Print(API_URL)
    23. Dim Answer As String = Bittrex_API_URL(API_URL)
    24. Debug.Print(Answer)
    25. End If
    26. End Sub


    SetAccount ist dabei die Funktion mit der ich das ganze aufrufe.
    Als Ergebnis kriege ich aus den debug.prints folgendes:

    Quellcode

    1. https://bittrex.com/api/v1.1/account/getbalances?apikey=037e7a76d6d0480a90801fbe1e31a298&nonce=1531669935
    2. 7edc5f6e31bdddb47e79ffe59c96cb0d04a1e415640a3c37af4334b0940a5b80
    3. {"success":false,"message":"APIKEY_NOT_PROVIDED","result":null}


    Erste Zeile die URI mit APi-Key und Nonce,
    zweite Zeile den HMAC SHA 256 Hash der URI mit API-Secret
    drite Zeile die Antwort des Webrequest. Der Hinweis APIKEY_NOT_PROVIDED sollte eigentlich einen Hinweis liefern was der Fehler ist, aber weiß trotzdem nicht woran es liegen könnte. Mein API-Key ist auf Read eingestellt, also sollte das zum Balance auslesen ausreichen. Zumindst bin ich schon ein Stück weiter, als ich angefangen hatte war die Fehlermeldung noch NONCE_NOT_PROVIDED. Es könnte beispielsweise ja auch ein Problem mit der Nonce sein dass der Zeitstempel nicht mehr aktuell ist.

    Hat jemand noch eine Idee was falsch sein könnte? Wie kann ich bei dem Web Request überprüfen ob das apisign auch richtig in den Header gepackt wurde?
    Bzw. eine weitere frage, hat jemand noch erfahrung mit der REST-API von Bittrex? die nächste Frage bei anderen Befehlen wäre nämlich, ob man die einzelnen Parameter in einer bestimmtem Reihenfolge angeben muss, da dann beim hashen ja jedesmal was anderes rauskommen würde.

    Wie gesagt der API-Key und Secret im Beispiel sind real und aktiv also kann das jeder damit ausprobieren wenn es hilft, Zugang zum Account hat man damit trotzdem nicht.



    Danke im Voraus

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Deshalb habe ich ja 2 mal geschrieben dass man mit dem Key eigentlich nichts machen kann. Stattdessen soll jemand den ruhig nutzen und versuchen dass da eine Antowrt vom Server kommt. Müsste eine JSON sein wo u.a. success:true drinsteht

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fufu“ ()

    Ich bin jetzt kein Experte in der Bittrex-API, allerdings rufst du die Methode "getBalances" auf, welche, laut API, nur den API-Key benötigt.
    In deinem Code aber gibst du noch die Nonce mit, welche laut Beispiel nicht benötigt wird.

    Vielleicht versuchst du es auch mal mit der neuen API? bittrex.github.io/
    Wenn man es nur mit dem Key macht (so war ja mein erster Versuch), dann kriegt man den erwähnten Fehler Nonce_NOT_PROVIDED. Das man das mit der Nonce und der Signatur im Header machen muss steht ganz oben auf deren Seite unter Authentifizierung mit dem erwähnten php Code-Beispiel (wo die u.a. auch getBalances benutzen, die Authentifizierungsmethode müsste also für alle Funktionen gleich sein außer die öffentlichen). Vom Prinzip geht es also darum diesen php-Teil in VB nachzuprogrammieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fufu“ ()

    Das könnte es sein, ich dachte ich hätte in der Erklärung über dem Code SHA 256 gelesen. DAs werde ich mal ausprobieren. Vielen Dank.

    Hast du meinen Code mit der geänderten Verschlüsselung mal ausprobiert?

    Keine Vollzitate, das schränkt den Lesefluss ein. Man kann auch den "einfachen" Antworten-Button ohne Zitate verwenden. Editiert. ~fufu

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „fufu“ ()

    harmenrabb schrieb:


    Hast du meinen Code mit der geänderten Verschlüsselung mal ausprobiert?


    Ich habe gestern mal den Beispielcode in PHP probiert, wobei ich in PHP gerade erst die Grundlagen lerne. Das hat sofort funktioniert.
    Ansonsten habe ich deinen Code nicht getestet, werde es im laufe des Tages mal versuchen.