JSON: mit Token und Cookie abgesicherte API über VB aufrufen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von KlyX.

    JSON: mit Token und Cookie abgesicherte API über VB aufrufen

    HI zusammen,

    wie vielleicht in anderen Threads bei Datenbankprogrammierung schon gesehen über ich mich zurzeit zum ersten Mal in der Nutzung einer REST-API. Was ich bisher geschafft habe:
    • REST-API soweit aufsetzen, dass sie funktioniert --> Benutze das projekt hier: github.com/mevdschee/php-crud-ap
    • Abruf der Daten in VB --> funktioniert mit JSON.net soweit einwandfrei
    • Absicherung der API über das "Zusatzmodul" von der obig benutzten REST-API: github.com/mevdschee/php-api-auth
      --> Funktioniert über den Browser einwandfrei
    • Übertragung der "Logindaten" per Post mit einem webClient --> klappt und erhalte ein Token zurück
    Problem: mit diesem Auth-Verfahren wird beim Aufruf ein Token generiert und eine Session. Diese wird (soweit ich das verstanden habe) in ein Session-Cookie gelegt.
    Das Token habe ich mit einem webClient erfolgreich abgeholt. Nur das Cookie bekomme ich damit wohl nicht.
    Was ich im Web so finde, bezieht sich immer auf HttpRequest etc.

    Meine Fragen:
    • Krieg ich das Session-Cookie ggf. auch einfach über meinen webClient (Code siehe unten) und dann wieder zurück beim Aufruf einer URL - oder muss ich das Ganze anders aufziehen?
    • Wenn ja: was wäre dabei sinnvoll?
    • Muss ich eigentlich das Token und das Cookie im gleichen webclient abrufen und wieder senden? Eigentlich ja oder? Sonst ist es ja eine andere Session, die ich öffne, richtig? ;)

    VB.NET-Quellcode

    1. Private Sub get_json_Click(sender As Object, e As EventArgs) Handles get_json.Click
    2. Using webClient As WebClient = New System.Net.WebClient()
    3. Dim n As WebClient = New WebClient()
    4. 'Logindaten an PHP-Datei per POST übergeben
    5. n.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    6. Dim bytArguments As Byte() = System.Text.Encoding.ASCII.GetBytes("username=" & api_user.Text & "&password=" & api_pass.Text)
    7. Dim bytRetData As Byte() = n.UploadData("https://kfzmanager.abacado.net/auth/api.php", "POST", bytArguments)
    8. 'Antwort von Server in String speichern, Anführungszeichen entfernen und in TextBox eintragen
    9. Dim answerstring As String = System.Text.Encoding.ASCII.GetString(bytRetData)
    10. answerstring = answerstring.Replace(Chr(34), "")
    11. api_token.Text = answerstring
    12. 'MessageBox zur Prüfung der korrekten URL, die aufgerufen wird
    13. MessageBox.Show(json_url.Text & "?csrf=" & answerstring)
    14. 'JSON URL zusammenstelle inkl. Token und abrufen
    15. Dim json = n.DownloadString(json_url.Text & "?csrf=" & answerstring)
    16. Dim tokens As JToken() = JObject.Parse(json).SelectToken("fuel").SelectToken("records").ToArray()
    17. Dim fuels As New List(Of Fuel)
    18. For Each x As JToken In tokens
    19. fuels.Add(New Fuel With {.ID = x(0).Value(Of Integer), .FuelName = x(1).Value(Of String), .FuelType = x(2).Value(Of String)})
    20. Next
    21. json_dgv.DataSource = fuels
    22. End Using
    23. End Sub


    Der Fehler den ich bislang - logischerweise - bekomme ist ein "nicht authorisiert"

    Die API ist erreichbar unter: kfzmanager.abacado.net/auth/api.php (direkt aufgerufen natürlich mit Fehler - wenn die POST-Daten korrekt übergeben werden, mit dem Token als Return)
    Um das Token und das Session-Cookie zur erhalten im Browser, kann kfzmanager.abacado.net/login.html verwendet werden (admin, admin)
    Die API kann dann mit kfzmanager.abacado.net/auth/api.php?csrf=tokenhiereingeben aufgerufen werden (ohne korrektes Token und korrekte Session mit Fehler)

    Ich freue mich auf Hinweise und Tipps.
    Bin hier wohl noch ganz am Anfang mit meinem Wissen ;)

    p.s. wäre es ggf. einfacher, nur Benutzername und Passwort zu verwenden? Ohne Token und/oder Session?
    Idee wäre dann: Username und gehashtes Passwort per Post zu übertragen. Gehashtes Passwort mit Hash in der DB prüfen.
    Wenn korrekt: Authorisierung OK.

    Danke!
    KlyX
    Chris' Weblog - Mein Blog rund um Vieles :D

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

    HI,

    leider konnte ich es nicht testen, da die Seite wohl nicht zu erreichen ist. kfzmanager.abacado.net/login.html

    Du kannst der WebClient-Klasse durchaus beibringen, Cookies zu handhaben.

    VB.NET-Quellcode

    1. Public Class WebClientWithCookies : Inherits WebClient
    2. Public Property CookieContainer As New CookieContainer
    3. Protected Overrides Function GetWebRequest(address As Uri) As WebRequest
    4. Dim r As WebRequest = MyBase.GetWebRequest(address)
    5. If Not r Is Nothing Then
    6. DirectCast(r, HttpWebRequest).CookieContainer = Me.CookieContainer
    7. End If
    8. Return r
    9. End Function
    10. End Class


    Alternativ kannst Du auch über die Headers.Add-Funktion der Standard WebClient-Klasse die Cookies hinzufügen, würde ich mir aber sparen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Danke dir - probier ich mal aus.

    Die URL funktionieren übrigens sehr wohl - aber natürlich nur, wenn man sie so aufruft, wie von der API vorgesehen :)
    Siehe auch mein ursprünglicher Post. Ist dort beschrieben :)
    Chris' Weblog - Mein Blog rund um Vieles :D
    Klasse, es funktioniert jetzt einwandfrei, sofern die richtigen Logindaten eingegeben werden :)
    Vielen herzlichen Dank @SpaceyX :)

    Jetzt werde ich noch schauen, dass Username und Passwort aus der DB kommen und das Passwort nur gehasht übertragen wird.
    Aber das krieg ich selbst hin :)
    Chris' Weblog - Mein Blog rund um Vieles :D