tastaturberuf / contao-doccheck-login-bundle Goto Github PK
View Code? Open in Web Editor NEWWith this Contao bundle you can implement your DocCheck login
With this Contao bundle you can implement your DocCheck login
Hallo Daniel,
ich habe auf einer öffentlichen Seite das Doccheck Modul eingebunden. Im Backend drücke ich auf Speichern und schließen und anschließend erhalte ich einen Internal Server Error:
"contao.fragment._contao.frontend_module.doccheck_login" has no container set, did you forget to define it as a service subscriber?
Der Fehler tritt nur in Contao 4.11.3 und nicht in 4.9.15 auf.
Kann man später ja noch beheben. Daher nur als Erinnerungsstütze.
Do we need this?
Hallo Daniel,
ich kann jetzt mehr dazu sagen, warum der Login in einigen Browsern nicht funktioniert. Es ist nicht wirklich ein Fehler, es ist mehr eine Limitation bei einigen Browsern.
Ich habe das Problem im aktuellen Firefox (94.0.1) unter Windows 10 nachstellen können.
In der freien Wildbahn wird man selten den Login so stricken können, dass eine Target-URL seitens Doccheck ausreicht. In der Regel hat man viele verschiedene Seiten, die geschützt werden müssen. Deshalb baut man sich einen Router, auf der man den Login und eine Bestätigungsseite baut, die dann per Javascript window.location.href = "{{link_url::back}}";
den Login zur vorherigen Seite (nämlich dort wo ein Modul, Inhaltselement platziert war) wieder initiiert.
Genau hier ist aber der Fehler. Der bfcache (Back-Forward Cache) macht aber den Login nicht möglich.
Der bfcache wird von jedem Browser unterschiedlich gehandhabt. Das erklärt die Symptomatik, dass es "in einigen Browsern" funktioniert.
Ich kann es mir nur so erklären, dass der Cache des iframes ein anderer ist, als der auf der Contao Seite wo der iframe eingebunden ist. Wenn nu der Browser bei erfolgreichen Login mittels Doccheck auf die COntao Seite zurückgeworfen wird, wird man auf den Cache des iframes geworfen und nicht auf die COntao Seite an sich. Sonst würde er ja auch eine valide Session in Contao erstellen.
window.location.href = "{{link_url::back}}";
wird dich zwar auf die Seite zurückleiten wo du warst, allerdings ohne dich in eine valide Frontend-Session bzw. Frontend-Gruppe zu überführen. In dem Doccheck iframe steht dann, dass man angemeldet ist, jedoch ohne, dass man als Contao FE-Mitglied behandelt wird.
Nach einem Reload funktioniert der Login.
Die Lösung besteht eigentlich darin, dass man statt window.location.href
besser window.location.replace
verwenden sollte.
Ich weiß nicht ob das ein Bug ist. Bei Typo3 wird hierzu die letzte URL separat im Modul gespeichert. Man umgeht also die problematik.
Wenn es für dich kein Bug ist, kann ich das ganze mal in eine Doku + samt Workaround schreiben. Ich denke, dass die Lösung ein window.location.replace("letzte seite");
ist. Die Frage ist nur, wie man die letzte Seite bekommt, ohne {{env::referer}}
zu verwenden.
Wie gesagt es ist weniger ein Problem in unserem Modul, sondern eher ein Problem, dass man bei mehreren geschützten Unterseiten haben wird. Hier brauch man zwangsläufig eine "Router-Seite".
Fällt dir da spontan etwas ein?
Hier noch einige Links:
whatwg/html#5879
https://web.dev/bfcache/
Hallo Daniel,
wäre es möglich die Parameter, die von DocCheck zurückgeworfen werden beizubehalten?
und nicht nur :
https://xxxxxx.de/doccheck-login.html
.. am Ende des redirects beizubehalten?
Wir möchten mit Google Analytics noch die Parameter der URL tracken.
Das müsste folgede Änderung im src/Controller/DocCheckLoginController.php sein:
- throw new RedirectResponseException($jumpTo->getFrontendUrl());
+ throw new RedirectResponseException($jumpTo->getFrontendUrl().'?'.\Environment::get('queryString'));
So erhält man auf der jumpTo-Seite ebenfalls noch die ganzen Parameter der die von DocCheck mitkommen. Was denkst du?
Ich habe es mit dem iframe auch getestet... würde problemlos funktionieren.
Hallo!
Habe ich das richtig verstanden, dass über diesen Login ausschließlich ein allgemeiner Login realisiert werden kann, ohne nach dem eingeloggten DocCheck-User zu differenzieren?
Also ich kann in Contao dann keine Mitglieds-individuellen Inhalte aufbauen und per Login schützen, da ein festes Contao-Mitglied im Modul definiert wird?
Zweite Frage: notwendig auf DocCheck-Seite ist nur die Basic-Lizenz, oder? Oder gewinnt man durch ein höheres Lizenz-Modell irgendwas im Zusammenspiel mit dem Modul?
Symfony\Component\HttpKernel\Exception\BadRequestHttpException:
Missing form field "_target_path". You probably need to adjust your custom login template.
at vendor/contao/core-bundle/src/Security/Authentication/AuthenticationSuccessHandler.php:180
at Contao\CoreBundle\Security\Authentication\AuthenticationSuccessHandler->decodeTargetPath(object(Request))
(vendor/contao/core-bundle/src/Security/Authentication/AuthenticationSuccessHandler.php:154)
at Contao\CoreBundle\Security\Authentication\AuthenticationSuccessHandler->determineTargetUrl(object(Request))
(vendor/contao/core-bundle/src/Security/Authentication/AuthenticationSuccessHandler.php:121)
at Contao\CoreBundle\Security\Authentication\AuthenticationSuccessHandler->onAuthenticationSuccess(object(Request), object(UsernamePasswordToken))
(vendor/tastaturberuf/contao-doccheck-login-bundle/src/Controller/DoccheckLoginController.php:172)
at Tastaturberuf\ContaoDoccheckLoginBundle\Controller\DoccheckLoginController->loginUser('doccheck', object(Request))
(vendor/tastaturberuf/contao-doccheck-login-bundle/src/Controller/DoccheckLoginController.php:111)
at Tastaturberuf\ContaoDoccheckLoginBundle\Controller\DoccheckLoginController->getResponse(object(FrontendTemplate), object(ModuleModel), object(Request))
(vendor/contao/core-bundle/src/Controller/FrontendModule/AbstractFrontendModuleController.php:40)
at Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController->__invoke(object(Request), object(ModuleModel), 'main', null)
(vendor/symfony/http-kernel/HttpKernel.php:158)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 2)
(vendor/symfony/http-kernel/HttpKernel.php:80)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 2, false)
(vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php:85)
at Symfony\Component\HttpKernel\HttpCache\SubRequestHandler::handle(object(HttpKernel), object(Request), 2, false)
(vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php:81)
at Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer->render('/_fragment?_path=_format%3Dhtml%26_locale%3Dde%26_controller%3Dcontao.frontend_module.doccheck_login', object(Request), array('ignore_errors' => false))
(vendor/symfony/http-kernel/Fragment/FragmentHandler.php:85)
at Symfony\Component\HttpKernel\Fragment\FragmentHandler->render(object(FrontendModuleReference), 'forward', array('ignore_errors' => false))
(vendor/contao/core-bundle/src/Fragment/FragmentHandler.php:84)
at Contao\CoreBundle\Fragment\FragmentHandler->render(object(FrontendModuleReference))
(vendor/contao/core-bundle/src/Resources/contao/modules/ModuleProxy.php:61)
at Contao\ModuleProxy->generate()
(vendor/contao/core-bundle/src/Resources/contao/elements/ContentModule.php:101)
at Contao\ContentModule->generate()
(vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:608)
at Contao\Controller::getContentElement(object(ContentModel), 'main')
(vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:218)
at Contao\ModuleArticle->compile()
(vendor/contao/core-bundle/src/Resources/contao/modules/Module.php:214)
at Contao\Module->generate()
(vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:71)
at Contao\ModuleArticle->generate(false)
(vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:536)
at Contao\Controller::getArticle(object(ArticleModel), true, false, 'main')
(vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:377)
at Contao\Controller::getFrontendModule('0', 'main')
(vendor/contao/core-bundle/src/Framework/Adapter.php:44)
at Contao\CoreBundle\Framework\Adapter->__call('getFrontendModule', array('0', 'main'))
(vendor/fritzmg/contao-inherit-article/src/EventListener/InheritArticleListener.php:139)
at InheritArticleBundle\EventListener\InheritArticleListener->getFrontendModule(object(PageModel), '0', 'main')
(vendor/fritzmg/contao-inherit-article/src/EventListener/InheritArticleListener.php:114)
at InheritArticleBundle\EventListener\InheritArticleListener->onGetPageLayout(object(PageModel), object(LayoutModel), object(PageRegular))
(vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:253)
at Contao\PageRegular->getPageLayout(object(PageModel))
(vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:77)
at Contao\PageRegular->prepare(object(PageModel))
(vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:48)
at Contao\PageRegular->getResponse(object(PageModel), true)
(vendor/contao/core-bundle/src/Resources/contao/controllers/FrontendIndex.php:337)
at Contao\FrontendIndex->renderPage(object(PageModel))
(vendor/symfony/http-kernel/HttpKernel.php:158)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/http-kernel/HttpKernel.php:80)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/http-kernel/Kernel.php:201)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(web/index.php:31)
maybe fix by terminal42/contao-autoregistration#7?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.