Problem bei Blob-URLs

Issue #1114 open
Stolz created an issue

Hallo Community,

in \node_modules\@masterportal\masterportalapi\src\layer\wms.js
wird in createLayerSource() für TileWMS() eine tileLoadFunction definiert die eine Object-/Blob-URL erzeugt:

async function defaultTileLoadFunction (imageTile, src) {
const response = await fetch(src),
data = await response.blob();

imageTile.getImage().src = URL.createObjectURL(data);

}

Problem an dieser Stelle: wenn die Blob-URL aus einem isSecured-WMS generiert wird gibt es einen 401-Error.

Gilt eigenartiger Weise auch nur für singleTile=false (-> TileWMS) weil nur hier die tileLoadFunction() definiert ist. Das ist doch so nicht gewollt? Pro Tile zusäzlich noch eine Blob-Source?

Danke&VG
Dietmar Stolz

Comments (13)

  1. Konstantin Holm

    Hallo Dietmar,

    Kannst du noch irgendwie mehr Infos geben, wie man das konkreter nachstellen kann? Wäre es möglich da eine Beispiel-Konfiguration zu bekommen?
    Dann könnte ich das besser nachvollziehen und der Sache auf den Grund gehen.

    Viele Grüße

    Konstantin Holm

  2. Stolz reporter

    Hallo Konstantin,

    das Verhalten kannst du im https://geoportal-hamburg.de/geo-online/ nachvollziehen.

    Wähle bspw. die Krankenhäuser aus, diese werden mit singleTile=false angefordert und für jede Kachel eine Blob-URL generiert. Wozu eigentlich?

    Wenn der Krankenhaus-Dienst geschützt wäre (isSecured-WMS) gäbe es aufgrund der Blob-Objects einen 401-Error für den gesamten Dienst.

    Habe selber keinen Secured-Dienst mit Internetzugang.

    Danke für deinen Support

    Dietmar Stolz

  3. Konstantin Holm

    @Hendrik Oenings Dieses Issue steht in Relation zu Issue#1081, welches du im Oktober 2023 bearbeitet hattest. Kannst du dir das mal ansehen?
    In der Git History sehe ich am 02.10.2023 von dir den Commit, wo du die defaultTileLoadFunction hinzugefügt hast

    Get WMS tiles using fetch to allow sending headers

    Overriding the tileLoadFuntion to use window.fetch allows for overriding window.fetch to pass additional headers (e.g., an
    Authorization header) to the WMS request.

    This is necessary to solve issue #1081 in Masterportal.

  4. Stolz reporter

    Hallo Konstantin,

    Issue#1081 bezieht sich auf das Thema “Masterportal-Login fehlerhaft” und ist nicht von mir.

    Hatte da - hoffentlich - nix doppelt gemeldet.

    VG

    Dietmar

  5. Konstantin Holm

    Hallo Dietmar,

    nein keine Angst, alles in Ordnung :)

    Mir war nur bei meiner Suche im Code aufgefallen, dass ein Kollege, der demnächst wieder da ist, vielleicht mehr weiß.

    Aktuell wirkt es so als hätte möglicherweise eine Lösung eines anderen Problems zu diesem Issue hier geführt. Ich würde da gerne die Meinung des Kollegen abwarten.

    VG

    Konstantin

  6. Hendrik Oenings

    Hallo Konstantin, bin zurück, sehe ich mir jetzt an.

    Hallo Dietmar,

    diese Anpassung mit den Blob-URLs wurde eingeführt, damit man beim Aufruf der WMS-Dienste zusätzliche Header übergeben kann (das geht mit reinen img-Tags nicht). Ich denke, dieses Ticket kann gelöst werden, indem bei dem fetch-Aufruf { credentials: 'include' } gesetzt wird, falls der Layer isSecured gesetzt hat (ähnlich passiert das ja bspw. in src/api/wmsGetFeatureInfo.js für die GFI-Requests).

    Du kannst gerne schon einmal testen, ob es für dich das Problem lösen würde, wenn die zitierte Zeile stattdessen const response = await fetch(src, { credentials: 'include' }), lautet. Ich werde das noch weiter prüfen und dann die nötigen Änderungen umsetzen.

    Viele Grüße
    Hendrik

  7. Stolz reporter

    Hallo Hendrik,

    das Problem bleibt bestehen:

    Access to fetch at 'https://geodaten.metropoleruhr.de/spw2?REQUEST=GetMap&SERVICE=WMS&VERSION=1.3.0&FORMAT=image%2Fjpeg&STYLES=&TRANSPARENT=false&CACHEID=467809&LAYERS=spw2_light&SINGLETILE=false&WIDTH=512&HEIGHT=512&CRS=EPSG%3A25832&BBOX=347973.3845397057%2C5632893.428430882%2C361520.0438911763%2C5646440.087782353' from origin 'https://koelngis-entw.verwaltung.stadtkoeln.de' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
    masterportal.js:170 
    
       Uncaught (in promise) TypeError: Failed to fetch
    at c.<anonymous> (masterportal.js:170:11819)
    at Generator.next (<anonymous>)
    at masterportal.js:170:11023
    at new Promise (<anonymous>)
    at f (masterportal.js:170:10843)
    at c.b [as tileLoadFunction_] (masterportal.js:170:11781)
    at c.load (masterportal.js:51:139847)
    at f.loadMoreTiles (masterportal.js:167:91433)
    at k.handlePostRender (masterportal.js:1065:22088)
    at masterportal.js:1065:28666
    

    VG

    Dietmar

  8. Hendrik Oenings

    Hallo Dietmar,

    sind denn die CORS-Header des Dienstes korrekt gesetzt?

    Die Masterportal-Doku verlangt ja für secure-Dienste, dass (1) Access-Control-Allow-Credentials: true gesetzt ist und (2) Access-Control-Allow-Origin: PORTAL-URL und nicht nur Access-Control-Allow-Origin: *. (services.json - WMSLayer.isSecured) Die Fehlermeldung klingt für mich zunächst danach, als wäre (2) nicht erfüllt.

    Viele Grüße
    Hendrik

  9. Inka Dudek

    Hallo Herr Stolz,

    ich schaue mir den Pull Request zu diesem Thema an.

    Leider gibt es in der Bibliothek ol-cesium (olcs), die wir für die 3D-Darstellung nutzen einen Bug, bei der custom imageLoadFunction im WMS und der Layer wird in 3D nicht dargestellt. Siehe https://github.com/openlayers/ol-cesium/issues/666

    Wie dringend ist Ihr Problem und nutzen Sie 3D?

    Können wir mit der Implementierung warten bis der Bug gefixt ist?

    Viele Grüße

    Inka Dudek

  10. Hendrik Oenings

    Hallo Dietmar,

    das Problem sollte ab der Version 2.45.0 behoben sein. Sollte das Problem weiterhin auftreten, bitte ich um Rückmeldung.

    Viele Grüße
    Hendrik

  11. Log in to comment