OAuth Token zu lang!?

Hallo,
ich versuche Daten an einen IoT Service zu senden und dazu muss ich einen OAuth Token auslesen.
Anscheinend ist die Response für den Token zu lang. Auf jeden Fall geht der JSON Parser immer mit einem Fehler auf die Bretter.
Mit writeToStream(&Serial) sehe ich allerdings, dass die Antwort korrekt ist.
Leider habe ich keine Ahnung, wie ich an den Token kommen kann.

Hat hier jemand eine Idee?

Hier der Code:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#include <ArduinoJson.h>

const char* ssid = "<-----wlan ssid----->";
const char* password = "<-----wlan passwort----->";

const char* iot_url = "https://<-----iot url----->/oauth/token";
const int iot_port = 443;

HTTPClient http;
WiFiClientSecure httpsClient;
WiFiClient espClient;

void getToken() {
      httpsClient.setInsecure(); 
      httpsClient.connect(iot_url, iot_port);      
      http.useHTTP10(true);
      http.begin(httpsClient, iot_url);     
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");  
  
      const char* token_content = \
        "grant_type=client_credentials" \
        "&response_type=token" \
        "&client_id=<-----client id----->" \
        "&client_secret=<-----client secret----->";
      int httpCode = http.POST(token_content);   //Send the request

      //TEST 1 - OK - Shows complete JSON Response!
      http.writeToStream(&Serial);
      
      //TEST 2 - 200 BUT payload is not complete! Same with getStream instead of getString
      String payload = http.getString();                  
      Serial.println(httpCode); 
      Serial.println(payload);

      //TEST 3 - Always deserialization ERROR :-(
      DeserializationError deserializeError;
      DynamicJsonDocument jsondoc(2048);
      deserializeError = deserializeJson(jsondoc, http.getStream());
      if ( ! deserializeError ) {
        const char* token = jsondoc["access_token"];
      }
      else {
        Serial.println("ERROR Deserialize ERROR");
      }

      http.end();  
}

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

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  getToken();  
}

void loop() {
}

Danke & Grüße,
Roger

Was passiert denn, wenn Du die Zeile mal auskommentierst?

Weiß jetzt nicht aus dem Kopf, ob writeToStream() nicht den cursor des streams ans Ende setzt.

Was kommt denn bei der Variable payload raus?

Ja das muss raus, sonst kommt nix im Payload an.
Aber das ist schon getestet. Also auch ohne das writeToStream geht es nicht.

Hast Du den 3. Test ohne die beiden vorher laufen lassen? So dürfte der keine Daten bekommen.

Gruß Tommy

Nein der bekommt dann natürlich keine Daten.
Das sollte nur Zeigen, dass weder getString noch getStream zum Ergebnis führt.
Beide bekommen im derserialize einen Error.

Wie sieht der Payload aus? Weil Du sagst, der ist unvollständig.
Wenn da was fehlt, sollte der Anbieter der passende Ansprechpartner sein.

Gruß Tommy

Hi Tommy,
per Postman gund writeToStream kommt der komplette Payload.
Aber getString und getStream liefern nur einen Teil des Payloads.
Daher kann es mit dem Anbieter nichts zu tun haben.
Grüße, Roger

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.