Authentifizierung mit FileMetadata

Hallo, ich habe das Backend (aus dem aktuellen Release) laufen mit einer File Metadata- JSON- Datei:

io.openems.backend.metadata.file [io.openems.backend.metadata.file.FileMetadata] INFO : Activate [path=/etc/openems-backend.d/metadata.json]

Laut einem Beitrag sieht die so aus:

obel1x:/etc/openems-backend.d # cat metadata.json
{
“edges”:{
“edge0”:{
“comment”:“OpenEMS Demo Edge”,
“apikey”:“test”,
“setuppassword”:“test”
}
}
}

Wenn ich nun im UI das Passwort eingebe kommt:

2022-04-22T19:54:52,384 [socket-1] WARN [mon.websocket.OnRequestHandler] [Ui.Websocket] JSON-RPC Error Response “Authentication failed” for Request {“method”:“authenticateWithPassword”,“params”:{“password”:“test”}}

Der dummy geht auch nicht, weder mit admin noch mit user oder guest, immer die gleiche Meldung.

Was tun?

Hallo @obel1x

ungetestet:

{
   edges: {
      edge0: {
         comment: “OpenEMS Demo Edge”,
         apikey: “test”,
         setuppassword: “test”
      }
   }
}

Gruß

Nein, das gibt gleich einen Fehler:

[io.openems.backend.metadata.file.FileMetadata] WARN : [Metadata.File] Unable to JSON-parse file [/etc/openems-backend.d/metadata.json]: JSON failed to parse [com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 55 path $.edges.edge0.comment]: {   edges: {      edge0: {         comment: “OpenEMS Demo Edge”,         apikey: “test”,         setuppassword: “test”      }   }}
Apr 27 19:46:03 obel1x java[12519]: io.openems.common.exceptions.OpenemsError$OpenemsNamedException: JSON failed to parse [com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 55 path $.edges.edge0.comment]: {   edges: {      edge0: {         comment: “OpenEMS Demo Edge”,         apikey: “test”,         setuppassword: “test”      }   }}

Auch im Validator nicht richtig: json format at DuckDuckGo
Danach kann ich das Backend gar nicht mehr per Websocket erreichen.

Er scheint die Anführungszeichen zu brauchen.

Habe jetzt folgenden Inhalt im Validator und laut log i.O.:

{
  "edges": {
    "node0": {
      "comment": "OpenEMS Demo Edge",
      "apikey": "test",
      "setuppassword": "test",
      "password": "test"
    }
  }
}

Tut leider auch nicht.

Debug-Modus liefert auch keine Erkenntnisse. Allerdings… ich habe ja das Edge noch gar nicht verbunden bekommen, siehe Edge und Backend auf einem Rechner: Address already in use - #2 by simonfey

Kann es sein, dass er nur den Zugang freischaltet, wenn das Edge dazu auch verbunden ist?

Hallo @obel1x,

Diesmal getestet.
Es hatten sich falsche Anführungszeichen hereingeschlichen, die Probleme verursachen.

sfey@sfey-vm-main:~/git/openems$ cat /tmp/metadata.json 
{
	edges: {
		edge0: {
			apikey: "test",
			setuppassword: "test",
			comment: "OpenEMS Demo Edge"
		}
	}
}

Bei mir führt dein Format zu denselben Fehlern.

Gruß

oooh - im validator gibt es noch immer fehler, aber im backend läuft dein format zumindest ohne fehler beim start. Danke! Ich werden gerade kein json- fan…

Leider besteht das Problem weiterhin - ich kann mich nicht anmelden mit dem passwort “test”.

Sobald ich die demo-edge starte, resettet sich das backend ja offensichtlich, siehe Edge und Backend auf einem Rechner: Address already in use

Kann das mit dem Passwort zu tun haben, oder sollte das Backend und das UI zusammen schon einen Login zulassen, auch ohne verbundenem Edge? Kannst du das mal probieren?

Hi @obel1x,

der APIKey sichert nur die Websocket-Verbindung zwischen Edge und Backend. Die Anmeldung an der Weboberfläche hat darauf keinen Einfluss.

Der Nutzerlogin müsste ohne die Eingabe von Benutzerdaten funktionieren:
FileMetadata dokumentiert das hier:

Die Benutzeranmeldung auf der Web-UI des Backends funktioniert auch ohne verbundenes Edge.
Hast du versucht, dich ohne Eingabe von Benutzerdaten “anzumelden”?

Viele Grüße
Simon

In der anmeldemaske sehe ich nur die Eingabe eines passworts… Egal was ich eingebe, es kommt immer der Fehler.
Muss ich ausser dem Adapter und der json- Datei mit dem Inhalt von oben noch etwas einstellen?
Sollte vllt das Backend nach einem user+Passwort fragen?

Moooment, ich sehe gerade den Hinweis " OpenEMS UI can work both for local connections to OpenEMS Edge as well as cloud connections to OpenEMS Backend. The switch requires some basic parameters that are defined in ‘environment’ files ui/src/themes/openems/environments. The possible parameters for ng serve -c…​ are defined in the ui/angular.json file"
→ Kann es sein, dass die Version unter releases des UIs so gebaut ist, dass diese nur auf ein Edge zugreifen kann und gar nicht erst nach Benutzer+Passwort fragt und das deshalb ein Zugriff auf ein Backend nicht geht?

Wenn ja: Ich wollte eigentlich die releases nehmen und nicht das UI selber bauen müssen, es ist schon schwierig genug, die im Apache zum laufen zu kriegen für mich ^^

Kann es an dem Build des Releases liegen, weil die Anpassungen am angular.json nur entweder edge oder backend zulassen und das release es auf edge stehen hat?

Falls ja: gibt es einen weg, die Einstellungen in dem Pfad des UI jetzt zu ändern?

Musste schon recht unschön die main.abirgendwas.js anpassen, damit der auf den richtigen host+port geht - kann man sowas übersteuern per konfigurationsdatei?

Hallo @obel1x,

die UI kann entweder für das Backend, alternativ für das Edge kompiliert, bzw. gestartet werden.
Ich z.B. kompiliere die Angular Anwendung mittels:

ng build -c "openems,openems-backend-prod,prod"

und kopiere den Inhalt des target/ Verzeichnisses nach /var/www/html auf einen entsprechenden Webserver.
Vermutlich versuchst du dich mit einer Edge-Variante der UI gegenüber einer Backend Instanz von OpenEMS anzumelden. Die Backend-Variante sollte dich mit Benutzername und Passwortabfrage begrüßen.

1 Like

das wird es sein, danke für den tipp! Der build hat nun schonmal funktioniert.

Bitte noch eine Hilfe dazu: in der datei backend-prod.ts und auch anderen wird als url “ws://” + location.hostname + “:8082” angegeben.

Ich habe schon andere Ratgeber befolgt, wie der ws auf wss “geproxyt” wird, was ja scheinbar auch funktioniert (sonst bekomme ich gar keine Verbindung).
Meine richtige URL soll deshalb sein:
“wss://obel1x.de:8078/openems-backend-ui”
(8078 ist der vhost, openems-backend-ui der redirect)

wie gesagt habe ich nur das backend laufen (die konfiguration davon unter /etc/openems-backend.d)

Kann ich mit einer Konfigurationsdatei irgendwo ausser durch Änderung des quellcodes nun die url in der UI entsprechend anpassen? Habe was von einer konfiguration gelesen, aber nicht gefunden, wo die sein soll, welche datei und was da rein soll.

Hie steht was davon:

Wie kommt also nun die richtige URL ins UI?

Hi @obel1x

ich habe das so gelöst:
in der backend-prod.ts steht:

    url: (location.protocol == "https:" ? "wss" : "ws") +
        "://" + location.hostname + ":" + location.port + "/openems-backend-ui",

Das Kompilat liegt dann unter /var/www/html/. Dieser Ordner wird von einem nginx via :80 zur Verfügung gestellt.
Daneben läuft ein nginx, der mit folgender Config eingehende Websocket-Verbindungen weiterleitet:

	location /openems-backend-ui {
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $host;

		proxy_pass http://localhost:8082;

		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
	}	

Jetzt benötigst du davor nur noch einen Load-Balancer, der HTTPS terminiert und auf HTTP weiterleitet. (z.B. Hetzner-Cloud)

Zu deiner Frage: “Wie kommt also nun die richtige URL ins UI?”
Antwort: Mit dieser Herangehensweise geht das ohne ein statisches einprogrammieren. Die Websocket-Verbindung wird zu demjenigen Server aufgebaut, von dem dein Browser die HTML Dateien lädt.

Gruß
Simon

1 Like

Also erstens mal tausend dank!!! So funktioniert das!
Ich weiss nicht richtig, wozu der load-balancer gut ist, bei mir gehts auch ohne, aber ich nutze auch apache und der hat auch nen reverse proxy - vielleicht gehts deshalb einfach so…

Also kurze Antworten:

  1. Das json-Format ist ne “sau” - openems und allgemeine validatoren liefern unterschiedliche ergebnisse, traue keinem validator für openems
  2. Der offizielle UI- Compile von den Releases ist unbrauchbar für die Backend- Nutzung. Wird zwar angedeutet, aber nicht richtig gesagt. Auch die Fehlermeldung im Backend könnte besser sein: Wenn das Backend auf keinen Fall nur passwort-anmeldungen nimmt, warum heisst es dann nur “Authentication failed” - es sollte wenigstens heissen: “Missing Username” oder noch besser ergänzt um “Maybe wrong UI: Edge-Compile instead of Backend-Compile” oder so.
  3. Es sollte darüber nachgedacht werden den backend compile mit zu releasen.
  4. Im UI gibts keine Möglichkeit ohne von dem git-repo abweichende Quelltextänderungen und eigener compile die Websocketverbindung zu konfigurieren. Das ist nirgends dokumentiert und sollte wirklich geändert werden, also z.B: durch eine Konfigurationsdatei für das UI.

Ich bin jetzt nicht so fit im entwickeln von Angular, aber würde mir unheimlich Änderungen daran wünschen.

Wie siehst du @simonfey das - hätten meine Wünsche Aussicht auf Umsetzung?

Nochmals riesen Dank!

Hi @obel1x,

freut mich, dass es nun funktioniert.

den Load-Balancer brauchst du hier nur, wenn du keinen gut konfigurierten Webserver davor hast. Zu deinen Punkten:

  • Die JSON-FileMeta Implementierung macht auf mich auch den Eindruck einer Alternativimplementierung. Wer ein System mit vielen Usern und Edges anstrebt wird hier Odoo einsetzen wollen oder eine eigene Implementierung gegen ein CMS vorsehen.
  • In deinen angesprochenen Punkten kannst du aktiv mithelfen. Die Dokumente für die Webseite sind Teil des Repositories: OpenEMS Docs. Fork → Improve → Pull-Request.
  • Das Auslagern von Parametern in eine Konfigurationsdatei ist (nach meiner Recherche) nicht trivial bei Angular Web Applications. Ich hatte in der Vergangenheit Probleme damit - ähnlich wie hier beschrieben: https://offering.solutions/blog/articles/2021/11/11/loading-configuration-before-your-angular-app-starts/

Viele Grüße
Simon

1 Like