Go Down

Topic: HTTP GET request mit Credentials, ServerCertificateValidation & SecurityProtocol (Read 177 times) previous topic - next topic

tbmsam

Hallo zusammen,

ich habe mit Hilfe von https://randomnerdtutorials.com/esp8266-nodemcu-http-get-post-arduino/ einen Arduino-Sketch erstellt, der einen HTTP GET request an einen WebService sendet, welcher derzeit auf einem Server läuft:

Code: [Select]
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char* ssid = "MyWiFiName";
const char* password = "MyWifiPassword";

//My Domain name with URL path or IP address with path
String serverName = "http://192.168.200.123:55558/api/DBGeraetestatus";

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;

// Timer set to 10 minutes (600000)
unsigned long timerDelay = 600000;
// Set timer to 5 seconds (5000)
//unsigned long timerDelay = 5000;

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}

void loop() {
  //Send an HTTP POST request every 10 minutes
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      HTTPClient http;

      String serverPath = serverName + "?filter=ipadresse&value=192.168.200.244"; 
  
      // My Domain name with URL path or IP address with path
      http.begin(serverPath.c_str());
     
      // Send HTTP GET request
      int httpResponseCode = http.GET();
     
      if (httpResponseCode>0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
        String payload = http.getString();
        Serial.println(payload);
      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);
      }
      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}



Als Antwort kommt ein JSON mit einem 4-stelligen PIN rüber. 

Der WebService auf dem Server sendet seinerseits einen weiteren HTTP GET request an eine spezielle Maschine, fügt aber NetworkCredentials (Name+Passwort) an:

Code: [Select]
private string getPinFromWebservice(string ip)
{
    Uri.TryCreate(string.Format(Constants.generatePinPath, ip), UriKind.Absolute, out requestUri);
    var request = HttpWebRequest.Create(requestUri);
    request.ContentType = "application/json";
    request.Method = "GET";
    NetworkCredential nc = new NetworkCredential("MyNetworkCredentialName", "MyNetworkCredentialPassword");
    CredentialCache cache = new CredentialCache();
    cache.Add(requestUri, "Basic", nc);
    cache.Add(requestUri, "NTLM", nc);
    request.Credentials = cache;
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            var json = reader.ReadToEnd();
            return System.Text.RegularExpressions.Regex.Replace(json, @"[^0-9]", "").ToString();
        }
    }
}


Ist es möglich, diese NetworkCredentials in Arduino/C ebenfalls anzufügen? Also kann man den unteren C#-Code irgendwie übersetzen, sodass er auf meinem ESP8266 läuft (inkl. des ServerCertificateValidation- sowie des SecurityProtocol-Parts)? Also sodass man den Server theoretisch überspringen und den HTTP GET request direkt an die Maschine senden kann.

Freue mich über jede Antwort. Vielen Dank im Vorraus für sämtliche Hilfe.

Liebe Grüße :)

uwefed


tbmsam

Wieso GET und nicht POST?
Hallo @uwefed und vielen Dank für deine Antwort.

Ähm, hat keinen speziellen, übergeordneten Grund, nur zum einen da es nur ein kurzer JSON-String (4-Stellige PIN) ist und zum andern da es egal ist ob die Parameter in der URL oder im Request mitgeschickt werden, der Path wird immer so aussehen: https://[IP der speziellen Maschine]/api/unlock/generate_pin

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

tbmsam

In welchem Forum möchtest Du nun die Antworten haben?

Gruß Tommy
Hallo @Tommy56 und vielen Dank für deine Nachricht.
 
Prinzipiell ist mir egal wo ich die Antworten bekomme, hauptsache ich bekomme irgendwo überhaupt eine adäquate Antwort^^

Liebe Grüße

Go Up