# Authentifizierung mit FileMetadata

**URL:** <https://community.openems.io/t/authentifizierung-mit-filemetadata/930>\
**Category:** Deutsches Forum\
**Created:** [April 22, 2022, 6:16pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930 "2022-04-22T18:16:30Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![obel1x](https://community.openems.io/user_avatar/community.openems.io/obel1x/32/461_2.png) [@obel1x](https://community.openems.io/u/obel1x)\
**Post date:** [April 22, 2022, 6:16pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/1 "2022-04-22T18:16:30Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![simonfey](https://community.openems.io/user_avatar/community.openems.io/simonfey/32/304_2.png) [@simonfey](https://community.openems.io/u/simonfey)\
**Post date:** [April 24, 2022, 11:50am UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/2 "2022-04-24T11:50:38Z")

</div>

Hallo @obel1x

ungetestet:

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

```

Gruß

---

<div class="post-metadata">

**Author:** ![obel1x](https://community.openems.io/user_avatar/community.openems.io/obel1x/32/461_2.png) [@obel1x](https://community.openems.io/u/obel1x)\
**Post date:** [April 27, 2022, 6:43pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/3 "2022-04-27T18:43:10Z")

</div>

Nein, das gibt gleich einen Fehler:

```auto
[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](https://duckduckgo.com/?t=ffab&q=json+format&ia=answer)  
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.:

```auto
{
  "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](https://community.openems.io/t/edge-und-backend-auf-einem-rechner-address-already-in-use/931/2)

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

---

<div class="post-metadata">

**Author:** ![simonfey](https://community.openems.io/user_avatar/community.openems.io/simonfey/32/304_2.png) [@simonfey](https://community.openems.io/u/simonfey)\
**Post date:** [April 27, 2022, 7:43pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/4 "2022-04-27T19:43:45Z")

</div>

Hallo @obel1x,

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

```auto
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ß

---

<div class="post-metadata">

**Author:** ![obel1x](https://community.openems.io/user_avatar/community.openems.io/obel1x/32/461_2.png) [@obel1x](https://community.openems.io/u/obel1x)\
**Post date:** [April 30, 2022, 9:47am UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/5 "2022-04-30T09:47:10Z")

</div>

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](https://community.openems.io/t/edge-und-backend-auf-einem-rechner-address-already-in-use/931)

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?

---

<div class="post-metadata">

**Author:** ![simonfey](https://community.openems.io/user_avatar/community.openems.io/simonfey/32/304_2.png) [@simonfey](https://community.openems.io/u/simonfey)\
**Post date:** [May 4, 2022, 5:47am UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/6 "2022-05-04T05:47:12Z")

</div>

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:

> <https://github.com/OpenEMS/openems/blob/dc63bfc6071ea2baa2ca3ed3b5ef1c16b224da85/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java#L62>

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

---

<div class="post-metadata">

**Author:** ![obel1x](https://community.openems.io/user_avatar/community.openems.io/obel1x/32/461_2.png) [@obel1x](https://community.openems.io/u/obel1x)\
**Post date:** [May 10, 2022, 3:29pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/7 "2022-05-10T15:29:51Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![simonfey](https://community.openems.io/user_avatar/community.openems.io/simonfey/32/304_2.png) [@simonfey](https://community.openems.io/u/simonfey)\
**Post date:** [May 11, 2022, 12:38pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/8 "2022-05-11T12:38:06Z")

</div>

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:

```auto
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.

---

<div class="post-metadata">

**Author:** ![obel1x](https://community.openems.io/user_avatar/community.openems.io/obel1x/32/461_2.png) [@obel1x](https://community.openems.io/u/obel1x)\
**Post date:** [May 13, 2022, 5:50pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/9 "2022-05-13T17:50:48Z")

</div>

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:

> [@Verbindung von UI zu Backend über wss](https://community.openems.io/t/verbindung-von-ui-zu-backend-uber-wss/733):
>
> Guten Tag zusammen, Ich beschäftige mich momentan mit dem Deployment von Backend und UI auf Azure. Bei mir läuft das Backend auf einer Azure Virtual Machine und das UI über eine Azure Web App. Mir ist hierbei aufgefallen, dass bei mir der Zugriff von UI auf Backend nur unverschlüsselt über http bzw. ws funktioniert. Ich würde es jedoch bevorzugen, dies über https bzw. wss zu erledigen. Ist das möglich und wenn ja, wie? Gruss Simon

Wie kommt also nun die richtige URL ins UI?

---

<div class="post-metadata">

**Author:** ![simonfey](https://community.openems.io/user_avatar/community.openems.io/simonfey/32/304_2.png) [@simonfey](https://community.openems.io/u/simonfey)\
**Post date:** [May 13, 2022, 7:05pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/10 "2022-05-13T19:05:30Z")

</div>

Hi @obel1x

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

```auto
    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:

```auto
	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

---

<div class="post-metadata">

**Author:** ![obel1x](https://community.openems.io/user_avatar/community.openems.io/obel1x/32/461_2.png) [@obel1x](https://community.openems.io/u/obel1x)\
**Post date:** [May 15, 2022, 3:52pm UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/11 "2022-05-15T15:52:15Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![simonfey](https://community.openems.io/user_avatar/community.openems.io/simonfey/32/304_2.png) [@simonfey](https://community.openems.io/u/simonfey)\
**Post date:** [May 16, 2022, 6:17am UTC](https://community.openems.io/t/authentifizierung-mit-filemetadata/930/12 "2022-05-16T06:17:13Z")

</div>

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](https://github.com/OpenEMS/openems/tree/dc63bfc6071ea2baa2ca3ed3b5ef1c16b224da85/doc/modules/ROOT/pages). 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/](https://offering.solutions/blog/articles/2021/11/11/loading-configuration-before-your-angular-app-starts/)

Viele Grüße  
Simon
