Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Serverseitige Möglichkeit auf Cookie-Zustimmung zu prüfen #124

Closed
ff1601com opened this issue Aug 11, 2022 · 18 comments
Closed

Serverseitige Möglichkeit auf Cookie-Zustimmung zu prüfen #124

ff1601com opened this issue Aug 11, 2022 · 18 comments
Labels
good first issue Good for newcomers

Comments

@ff1601com
Copy link

Hallo,

gibt es eine Möglichkeit die Cookie-Zustimmung über PHP zu erfragen?
Die Seite lasse ich nach jeder Änderung an den Cookies reloaden, da ich bereits die addModule - Methode verwende.

Nun benötige ich aber noch eine Möglichkeit, irgendwie via PHP auf die Cookie-Zustimmung zu prüfen.

Besteht eine solche Möglichkeit?

Vielen Dank bereits für die Mühe!

@doishub
Copy link
Member

doishub commented Aug 11, 2022

Du kannst über das CookieLogModel die bisher abgefragten Einwilligungen abrufen.

PS: Die addModule-Methode ist eigentlich dafür da, damit die Seite nicht zwingend neu geladen werden muss. 😉

@ff1601com
Copy link
Author

Du kannst über das CookieLogModel die bisher abgefragten Einwilligungen abrufen.

PS: Die addModule-Methode ist eigentlich dafür da, damit die Seite nicht zwingend neu geladen werden muss. 😉

Gute Idee, dann versuche ich das mal mit dem CookieLogModel.

PS: Oh, dann habe ich da vielleicht gerade einfach etwas verwechselt :D

@ff1601com
Copy link
Author

ff1601com commented Aug 12, 2022

@doishub Wenn ich das richtig verstehe, dann müsste ich in diesem Fall über folgende Methode gehen:
CookieLogModel::findOneByIp([]);, da ich ja nur über die IP erfragen kann, ob der derzeitige Client auch wirklich zugestimmt hat.

Nun meine Frage bezüglich der Anonymisierung: Bei der Cookiebar wird ja das letzte Oktett der IPv4 Adresse maskiert.
Wie komme ich am besten an die IP des Clients, um mit der obigen Methode diesen Abgleich anzustellen?

Edit, ich ziehe die Frage, wie an die IP gekommen wird zurück.
Habe es gerade gefunden.

$strIp = $ip ?? Environment::get('ip');

        if(System::getContainer()->getParameter('contao_cookiebar.anonymize_ip'))
        {
            $strIp = IpUtils::anonymize($strIp);
        }

@doishub
Copy link
Member

doishub commented Aug 12, 2022

Ich bin mir unsicher, ob das ein so guter Weg ist. Ich denke, damit könntest du schon zum Ziel kommen, je nachdem, was genau deine Anforderungen sind und wann du die Informationen serverseitig abfragst. Solltest du den Besucher direkt nach dem Akzeptieren identifizieren wollen, wird es womöglich gehen. Wenn du deinen use-case beschreibst, findet man ggf. eine bessere Lösung, wenn es allerdings so für deine Zwecke ausreicht - umso besser 😉

@ff1601com
Copy link
Author

ff1601com commented Aug 12, 2022

@doishub Ja, da mache ich mir gerade auch meine Gedanken.

Also kurz zum Use-Case:
Ich muss ein externes Javascript Tool dynamisch nachladen.

Dies wäre eigentlich über Javascript super einfach und hatte ich bereits so implementiert.
Leider ist das Tool nicht wirklich dynamisch nachladefähig, da hier aus mir unerklärlichen Gründen über document.write() der Dokument-Stream beschrieben wird.

Beim dynamischen Nachladen via Javascript passiert dann folgendes:

  • Bis zum Nachladen hat sich der Dokument-Stream bereits vollständig aufgebaut
  • Der bestehende Dokument-Stream wird von der Methode geleert und neu beschrieben.

Daraus folgt, dass dann nur noch das externe Javascript Tool auf der Seite ausgegeben wird.

Hätte ich eine Möglichkeit das ganze serverseitige zu prüfen, könnte ich es so implementieren, dass die Funktionalität noch während des Streamaufbaus aufgerufen wird und diesen Stream dann nicht überschreibt.

Ich hoffe das war einigermaßen verständlich.
Und vielen Dank für deine Mühe, das ist nicht selbstverständlich :)

@fritzmg
Copy link
Contributor

fritzmg commented Aug 12, 2022

Ich denke du solltest lieber das client seitige Problem lösen.

@ff1601com
Copy link
Author

Ich denke du solltest lieber das client seitige Problem lösen.

Also ein anderes Tool verwenden oder gibt es noch andere Möglichkeiten?

@doishub
Copy link
Member

doishub commented Aug 12, 2022

Ich hatte auch bereits mit Widgets zu kämpfen (von Verkehrsnetzen o.ä.) und hatte ein ähnliches Problem. Das Widget wollte sich einfach nicht nachladen lassen, weswegen ich einen kleinen Umweg gegangen bin.

Ich habe mir einfach einen neuen iFrame-Typen erzeugt und eine leere Seite angelegt, wo ausschließlich das Skript des Drittanbieters lag. Diese habe ich dann wie YouTube und andere iFrames behandelt und über die Cookiebar geblockt. Vielleicht kannst du es auch so machen.

@ff1601com
Copy link
Author

Ich hatte auch bereits mit Widgets zu kämpfen (von Verkehrsnetzen o.ä.) und hatte ein ähnliches Problem. Das Widget wollte sich einfach nicht nachladen lassen, weswegen ich einen kleinen Umweg gegangen bin.

Ich habe mir einfach einen neuen iFrame-Typen erzeugt und eine leere Seite angelegt, wo ausschließlich das Skript des Drittanbieters lag. Diese habe ich dann wie YouTube und andere iFrames behandelt und über die Cookiebar geblockt. Vielleicht kannst du es auch so machen.

Ist ja lustig, genau das gleiche hatte ich quasi auch als "Notlösung" gemacht :D
Ich dachte nur, es gäbe vielleicht noch einen anderen Weg.

@fritzmg
Copy link
Contributor

fritzmg commented Aug 12, 2022

Also ein anderes Tool verwenden oder gibt es noch andere Möglichkeiten?

Nein, analysieren was genau das Problem mit dem Script ist.

@ff1601com
Copy link
Author

Also ein anderes Tool verwenden oder gibt es noch andere Möglichkeiten?

Nein, analysieren was genau das Problem mit dem Script ist.

Naja das Problem ist, dass die Cookies abgefragt werden und dann, wenn die Zustimmung vorliegt, das Script geladen wird.
Das Script schreibt bzw. überschreibt via document.write() den Dokument-Stream, da dieser sich bereits vollständig aufgebaut hat.

Einzige Lösung an dieser Stelle wäre dann, dass man es irgendwie schafft, dass das Script vor dem fertigstellen des Dokument-Streams geladen wird. Oder übersehe ich etwas?

Aber das wirkt z.B recht schwierig, wenn man es dynamisch auf der Seite nachladen will.

@fritzmg
Copy link
Contributor

fritzmg commented Aug 12, 2022

Das Script schreibt bzw. überschreibt via document.write() den Dokument-Stream, da dieser sich bereits vollständig aufgebaut hat.

Wie bindest du das Script ein?

@fritzmg
Copy link
Contributor

fritzmg commented Aug 12, 2022

Generell gibt es für JavaScripts, die (leider) document.write() verwenden Lösungen wie postscribe.

@ff1601com
Copy link
Author

@fritzmg Das ist ja mal stark, wusste ich gar nicht. Vielen lieben Dank für den Input :)

@ff1601com
Copy link
Author

Das Script schreibt bzw. überschreibt via document.write() den Dokument-Stream, da dieser sich bereits vollständig aufgebaut hat.

Wie bindest du das Script ein?

Sorry, den vorherigen Kommentar übersehen.
So:

<script>
    document.addEventListener("DOMContentLoaded", function() {
        cookiebar.addModule(18, function(){
            const script = document.createElement('script');
            script.type = 'text/javascript';
            script.src = 'https://widget.simplybook.it/v2/widget/widget.js';
            script.onload = initialize;
            document.getElementById('simplybooktool').append(script);
            document.getElementById('simplybooktool').classList.remove('blockedScreen');
        }, {
            selector: '#simplybooktool',
            message: 'Durch einen Klick können Sie das Laden von SimplyBook ermöglichen.',
            button: {
                show: true,
                text: 'Laden',
                type: 'button',
                classes: 'button'
            }
        });
    });
</script>
<div style="width: 500px; height: 500px;" id="simplybooktool" class="block blockedScreen">
</div>
<script>
    function initialize() {
        var widget = new SimplybookWidget('Hier sind dann die Daten für das Widget drin');
    }
</script>

@doishub
Copy link
Member

doishub commented Aug 12, 2022

Ist ja lustig, genau das gleiche hatte ich quasi auch als "Notlösung" gemacht :D Ich dachte nur, es gäbe vielleicht noch einen anderen Weg.

Ja, das ist wirklich nicht die beste Lösung. 😀 postscribe scheint aber ein guter Weg zu sein, um diesen Fall zu behandeln. Vielleicht magst du deine Erkenntnisse anschließend hier teilen 🙏

@ff1601com
Copy link
Author

@doishub Hey, ich wollte mich nochmal melden, da dir die Erkenntnisse ja auch wichtig waren.
Also ich habe nun einfach folgendes gemacht:

<script>
    document.addEventListener("DOMContentLoaded", function() {
        cookiebar.addModule(18, function() {
            const simplybooktool = document.querySelector('#simplybooktool');
            simplybooktool.classList.remove('blockedScreen');
            postscribe('#simplybooktool', '<script src=//widget.simplybook.it/v2/widget/widget.js><\/script>');
            postscribe('#simplybooktool', '<script>var widget = new SimplybookWidget('Hier sind dann die Daten für das Widget drin');<\/script>');

        }, {
            selector: '#simplybooktool',
            message: 'Durch einen Klick können Sie das Laden von SimplyBook ermöglichen.',
            button: {
                show: true,
                text: 'Laden',
                type: 'button',
                classes: 'my-btn'
            }
        });
    });
</script>

Nun wird es nur nachgeladen, wenn der Cookie akzeptiert wurde und überschreibt mir nicht mehr meinen Dokument-Stream.
Vielen Dank an @fritzmg!

@doishub
Copy link
Member

doishub commented Aug 15, 2022

Danke fürs Teilen :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

3 participants