NEWS
Zugangsgeschützte API-Schnittstelle auslesen mit Blockly
-
@tt-tom Ja, nachdem ich httpPost durch httpGet ersetzt habe, jetzt kommt zumindest nach 3 Sekunden die Meldung:
javascript.0 16:19:13.539 info Start JavaScript script.js.common.Hycube_neu (Javascript/js) javascript.0 16:19:13.551 info script.js.common.Hycube_neu: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 16:19:16.554 error script.js.common.Hycube_neu: timeout of 3000ms exceeded
Aber weiteres bekomme ich nicht. Was jetzt?
-
@oliverio Mit dem alten Beispielscript und dem Request-Befehl funktioniert es seit mindestens zwei Jahren, aber eben seit ca. 2 Monaten nur noch mit folgendem (zweifachen) Warnhinweis im Log alle fünf Sekunden:
javascript.0 241772 2024-07-14 16:26:49.736 warn script.js.Steuerung.Hycube: request package is deprecated - please use httpGet (or a stable lib like axios) instead! javascript.0 241772 2024-07-14 16:26:49.812 warn script.js.Steuerung.Hycube: request package is deprecated - please use httpGet (or a stable lib like axios) instead!
Natürlich ersetze ich hier im Forum die tatsächliche, lokale IP des Hycube-Gerätes durch "ip".
-
@schnipsel71 lass mal das timeout weg.
-
@tt-tom Da kommt nur das zurück:
javascript.0 17:09:12.076 error script.js.common.Hycube_TT-Tom: timeout of 2000ms exceeded
-
habe mir noch mal den Code aus Post 2 angesehen. is nur ein Versuch
httpGet( 'http://ip/auth/', { headers: { 'Authorization': '(Basic hycube:hycube)' }, }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } )
oder mal die Klammern beim User:password weglassen.
-
@tt-tom sagte in Zugangsgeschützte API-Schnittstelle auslesen mit Blockly:
oder mal die Klammern beim User:password weglassen.
es wird immer mehr verschlimmbessert.
so funktioniert Basic Authentiction nicht.
Also entweder überlasst ihr das dem httpPost, in dem ihr im configobjekt user und password gemäß der doku angebt. dann erstellt das system für euch den header richtig
oder ihr erstellt den header selber, dazu muss aber userid und password richtig kodiert werden.
https://de.wikipedia.org/wiki/HTTP-Authentifizierung#Basic_Authentication
vergleiche dazu mein Beispiel wo das so gemacht wird.Allerdings kommt die Anfrage ja noch gar nicht soweit, da der Server auf die Anfrage ja nicht reagiert und nach timeout die abfrage abgebrochen wird.
-
@tt-tom Jetzt kommt tatsächlich folgende Reaktion im Log:
javascript.0 19:11:08.887 info script.js.common.Hycube_TT-Tom: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 19:11:08.923 info script.js.common.Hycube_TT-Tom: 401 javascript.0 19:11:08.924 info script.js.common.Hycube_TT-Tom: javascript.0 19:11:08.924 info script.js.common.Hycube_TT-Tom: Object [AxiosHeaders] { 'access-control-allow-headers': 'Authorization', 'access-control-allow-origin': '*', connection: 'close', 'content-length': '0', 'content-type': 'cty', 'www-authenticate': 'Basic realm="00"' } javascript.0 19:11:16.897 info Stopping script script.js.common.Hycube_TT-Tom
Was fange ich damit jetzt an?
-
401 ist Unautorized
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
vgl dazu mein beitrag von soeben -
@oliverio sagte in Zugangsgeschützte API-Schnittstelle auslesen mit Blockly:
401 ist Unautorized
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
vgl dazu mein beitrag von soebenDanke für die Info.
Immerhin aber wenigstens mal ein Lebenszeichen.Wie kann ich denn nun aber ganz konkret die Authentifizierung richtig durchführen?
Hier mal das API-Manual vom Hycube-System:
hycube API_Manual.pdf -
Probiere mal das.
httpGet( 'http://ip/auth/', { headers: { "Authorization": Buffer.from("Basic hycube:hycube").toString(’base64’) }, }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } )
-
@oliverio sagte in Zugangsgeschützte API-Schnittstelle auslesen mit Blockly:
Also entweder überlasst ihr das dem httpPost, in dem ihr im configobjekt user und password gemäß der doku angebt. dann erstellt das system für euch den header richtig
httpGet( 'http://ip/auth/', null, { basicAuth: { user: 'hycube', password: 'hycube' } }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } );
-
@tt-tom sagte in Zugangsgeschützte API-Schnittstelle auslesen mit Blockly:
"Authorization": Buffer.from("Basic hycube:hycube").toString(’base64’)
leider auch nicht. Basic soll nicht mit codiert werden.
"Authorization": "Basic " + Buffer.from("hycube:hycube").toString(’base64’)
Ist lustigerweise im Herstellerbeispiel auch falsch
Besser ist aber über config-objekt -
@tt-tom Dieser Code:
httpGet( 'http://ip/auth/', { headers: { "Authorization": "Basic " + Buffer.from("hycube:hycube").toString(’base64’) }, }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } )
ergibt folgenden Fehler:
javascript.0 20:13:06.962 info Start JavaScript script.js.common.Hycube_TT-Tom (Javascript/js) javascript.0 20:13:06.963 error script.js.common.Hycube_TT-Tom compile failed: at script.js.common.Hycube_TT-Tom:6
...scheint also nur ein syntaktischer Fehler zu sein...
-
@oliverio Dieser Code:
httpGet( 'http://ip/auth/', null, { basicAuth: { user: 'hycube', password: 'hycube' } }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } );
ergibt diese Fehlermeldungen:
javascript.0 20:17:23.191 info Start JavaScript script.js.common.HycubeOliverIO (Javascript/js) javascript.0 20:17:23.194 error script.js.common.HycubeOliverIO: TypeError: Cannot read properties of null (reading 'headers') javascript.0 20:17:23.195 error at script.js.common.HycubeOliverIO:2:1 javascript.0 20:17:23.195 error at script.js.common.HycubeOliverIO:25:3
Vielleicht hilft dir das weiter...
-
@schnipsel71 sagte in Zugangsgeschützte API-Schnittstelle auslesen mit Blockly:
wir nähern uns httpGet hat 2 Argumente und httpPost hat 3
httpGet( 'http://ip/auth/', { basicAuth: { user: 'hycube', password: 'hycube' } }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } );
bitte über den werkzeugschlüssel auch mal noch alles anschalten
-
@oliverio Okay, folgende Meldungen:
javascript.0 20:47:50.692 info Start JavaScript script.js.common.HycubeOliverIO (Javascript/js) javascript.0 20:47:50.702 info script.js.common.HycubeOliverIO: httpGet(config={"method":"get","url":"http://ip/auth/","responseType":"text","responseEncoding":"utf8","timeout":2000,"auth":{"username":"hycube","password":"hycube"},"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"}}) javascript.0 20:47:50.703 info script.js.common.HycubeOliverIO: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 20:47:50.741 info script.js.common.HycubeOliverIO: 401 javascript.0 20:47:50.741 info script.js.common.HycubeOliverIO: javascript.0 20:47:50.741 info script.js.common.HycubeOliverIO: Object [AxiosHeaders] { 'access-control-allow-headers': 'Authorization', 'access-control-allow-origin': '*', connection: 'close', 'content-length': '0', 'content-type': 'cty', 'www-authenticate': 'Basic realm="00"' }
Leider ist die böse 401 wieder dabei...
-
Hatte ich schon mal gefragt, dein Code. Hatte irgendwie nicht funktioniert.
Ps: jetzt ist erstmal EM kucken
-
nein der ist falsch, wie gesagt, bei get nur 2 argumente (url+config)
und bei httppost 3 argumente, url+daten+config -
so jetzt per header.
einmal so wie es sein sollte und einmal ein header wie er bei request wohl funktioniert hat, aber eigentlich nicht richtig ist. Das Basic wird angegeben fließt aber in die base64 kodierung nicht einhttpGet( 'http://jsonplaceholder.typicode.com/posts', { headers: { "Authorization": "Basic " + Buffer.from("hycube:hycube").toString("base64") } }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } );
httpGet( 'http://jsonplaceholder.typicode.com/posts', { headers: { "Authorization": Buffer.from("Basic hycube:hycube").toString("base64") } }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } );
-
@oliverio Ich verstehe nicht ganz: Was hat der Code mit meiner Anlage von Hycube zu tun? Ist die URL ein Versehen und soll dort stattdessen die IP meiner Hycube-Anlage stehen?
Wenn ich folgenden Code teste:httpGet( 'http://ip/auth/', { headers: { "Authorization": Buffer.from("Basic hycube:hycube").toString("base64") } }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } );
dann bekomme ich folgende LOG-Einträge:
javascript.0 23:49:41.323 info Start JavaScript script.js.common.HycubeOliverIO (Javascript/js) javascript.0 23:49:41.325 info script.js.common.HycubeOliverIO: httpGet(config={"method":"get","url":"http://ip/auth/","responseType":"text","responseEncoding":"utf8","timeout":2000,"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0","Authorization":"QmFzaWMgaHljdWJlOmh5Y3ViZQ=="}}) javascript.0 23:49:41.326 info script.js.common.HycubeOliverIO: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 23:49:41.392 info script.js.common.HycubeOliverIO: 200 javascript.0 23:49:41.392 info script.js.common.HycubeOliverIO: ewogICAgIlBlcm1pc3Npb24iOiAzLAogICAgImV4cCI6IDE3MjA5OTczODEKfQo= javascript.0 23:49:41.392 info script.js.common.HycubeOliverIO: Object [AxiosHeaders] { 'access-control-allow-headers': 'Authorization', 'access-control-allow-origin': '*', connection: 'close', 'content-length': '64', 'content-type': 'cty' }