NEWS
[Gelöst] Cross-site API call in der Admin-Ansicht
-
Moin Zusammen,
ich brauche bitte Hilfe bei folgendem Problem:
Ich habe einen Adapter (dysonAirPurifier) bei dem zum ordentlichen Login seitens dyson eine 2-Faktor Authentifizierung notwendig ist. Um das zu realisieren möchte ich folgendes implementieren:- User installiert den Adapter
- User konfiguriert den Adapter mit Basis-Daten (eMail, Passwort, Land, ...)
- User klickt auf einen Button um die 2FA-Daten anzufordern (dafür sind 2 dyson API-Calls notwendig)
- User gibt den Code, den er per Mail von dyson erhalten hat in die Config ein und der Adapter ist startfähig.
Ich suche mir seit Tagen die Finger blutig und probiere Sachen aus, aber nichts will funktionieren.
- Ich habe versucht das direkt in der index_m.html per fetch() zu machen - scheitere aber an den CORS Richtlinien.
- Ich habe versucht Code per emit() und sendTo() im Backend aufzurufen um dann die API-Calls einfach mit axios zu machen - aber das Backend läuft ja zu dem Zeitpunkt noch gar nicht. Da gibt es also nichts was ich aufrufen könnte.
Kurzum: Ich habe keine Idee mehr, wie ich das hinbekommen könnte.
Kann mir hier bitte jemand ein bisschen zur Seite stehen? Ist ja auch möglich, das ich einfach nur im die komplett falsche Richtung denke. -
@grizzelbee sagte in Cross-site API call in der Admin-Ansicht:
- Ich habe versucht Code per emit() und sendTo() im Backend aufzurufen um dann die API-Calls einfach mit axios zu machen - aber das Backend läuft ja zu dem Zeitpunkt noch gar nicht. Da gibt es also nichts was ich aufrufen könnte.
Das ist schon der richtige Ansatz. Es gibt immer wieder Adapter, die zuerst gestartet werden müssen um die dann zu konfigurieren. Du kannst theoretisch auch aus dem Admin HTML heraus den Adapter starten, aber ich würde einfach den User darauf hinweisen, dass er zuerst den Adapter starten muss.
Hier ein Beispiel:
https://github.com/deMynchi/ioBroker.meteoswiss/blob/2baf382a6350311cff2367e6b67ba2a2471388a7/admin/index_m.html#L38-L43 -
@unclesam sagte in Cross-site API call in der Admin-Ansicht:
Das ist schon der richtige Ansatz. Es gibt immer wieder Adapter, die zuerst gestartet werden müssen um die dann zu konfigurieren. Du kannst theoretisch auch aus dem Admin HTML heraus den Adapter starten, aber ich würde einfach den User darauf hinweisen, dass er zuerst den Adapter starten muss.
Okay. Vielen Dank für deine Antwort. Dann setze ich mich mal weiter damit auseinander und werde das so bauen. Immerhin gut zu wissen, dass man nicht in eine falsche Richtung läuft.
-
Ich brauche bitte noch einmal Hilfe ...
Ich habe da jetzt ein bisschen dran gearbeitet und es funktioniert auch soweit.
Ich kann die Message im Admin abschicken und sie wird in der main.js von onMessage gefangen und weiter verarbeitet. So weit - so gut.Ich benötige aber eine Rückkopplung zurück ins Admin, denn es kann durchaus sein, dass bei der Anfrage, die ich abschicke ein Fehler raus kommt und den möchte ich direkt im Admin präsentieren und nicht nur im Log.
Wie gelange ich also mit einer Information zurück ins Admin?
Ich habe versucht eine Exception zu werfen, aber die wird irgendwo im Adapter gefangen und ins Log geschrieben - mehr aber auch nicht.
Ich vermute das das irgendwie über die im Aufruf erwähnte callback:
this.socket.emit('sendTo', [adapter,instance].join('.'), 'getDyson2faMail', {email:document.getElementById("email").value, pwd:document.getElementById("Password").value, country:document.getElementById("country").value},function (data) { callback(data); });
laufen müsste, aber die steht mir in onMessage(msg) {...} ja nicht zu Verfügung...
Ich durchblicke den Mechanismus noch nicht richtig. Hast Du da noch einmal einen Tipp für mich?
Edit: Ich habe es jetzt verstanden und es funktioniert. DANKE!