2017-07-04 3 views
1

Ich stoße auf ein Problem mit der Umleitung, die passiert, nachdem sich ein Benutzer meiner App mit Keycloak authentifiziert hat.Keycloak redirect_fragment kollidiert mit react-router hashRouter

Meine App verwendet Reag-Router HashRouter. Wenn die anfängliche Umleitung geschieht, erhalte ich eine redirect_fragment, die etwa wie folgt aussieht:

http://localhost:3000/lol.html?redirect_fragment=%2F&redirect_fragment=%2Fstate%3D1c5900ee-954f-4532-b01c-dcf5d88f07a2%26code%3DKZNXVqQCcIXTCFu2ZIkx4quXa6zJb59zGKpNIhZwfNo.d2786d1e-67cd-437f-a873-bad49126bad4&redirect_fragment=%2Fstate%3D51a9cb44-b80a-4c14-8f3d-f04dfdb84377%26code%3Dp5cKQ7xVCR_n1s4ucXZTSE3O1T5lwNri_PBKD07Mt1Y.63364a83-f04f-4e64-a33e-faf00f6cd4ff&redirect_fragment=%2Fstate%3D05155315-ab60-4990-8d4e-444c7cce9748%26code%3DBxxpf_uMB28rKAQ6MXFTTrL9RE4rC3UtwCMXLu_K1Zo.4ce56da0-8e52-47e3-a0f2-4f982599bb98#/state=f3e362e4-c030-40ac-80df-9f9882296977&code=8HHTgd3KdlfwcupXR_5nDV0CqZNPV1xdCu3udc6l5xM.97b3ea71-366a-4038-a7ce-30ac2f416807

Die URL, von dort wächst. Ich habe bereits ein paar Posts gelesen, die darauf hinweisen, dass die Umleitung von keycloak möglicherweise ein Problem mit dem clientseitigen Routing über location.hash hat ... Irgendwelche Gedanken würden mir gefallen!

Antwort

0

Ich denke, ich habe es herausgefunden!

Die Umleitungsschleife scheint zu stoppen, wenn ich den 'noslash' hashRouter anstelle der Standard verwenden, die einen Schrägstrich enthält.

Meine URLs wie folgt aussehen: localhost:3000/lol.html#client/side/route

statt dessen: localhost:3000/lol.html#/client/side/route

Die Umleitung nun in geeigneter Weise nach einer Umleitung zu beenden scheint, aber jetzt in ein anderes Problem, das ich bin mit dem der Hash-Teil Meine Route wird durch reagieren-Router nicht geehrt ...

EDIT: ich aus

reagieren-Router die zweite Ausgabe dachte einen Wrapper umschafft 210 dass es verwendet, um zu sagen, auf welcher clientseitigen "Seite" es sich gerade befindet. Ich fand, dass dieser Wrapper nicht mit window.location synchronisiert war.

Überprüfen Sie diesen Konsolenausgang. Dies wurde unmittelbar nach der Umleitung aufgelöst wurde (und die Seite war leer):

Geschichte Pfadname ist /state=aon03i-238hnsln-soih930-8hsdlkh9-982hnkui-89hkgyq-8ihbei78-893hiugsu

Geschichte Hash ist (leer)

window.location Pfadname ist /lol.html

Fenster. Lage Hash #users/1

die state=blah-blah-blah im history.pathname Teil der Umleitungs-URL ist, die nach auth sendet keycloak. Sie werden feststellen, dass window.location auf den korrekten Pfad/Hash aktualisiert wurde, aber dieser Verlauf scheint nur eine URL zu sein. Vielleicht ändert keycloak direkt window.location um diese Umleitung durchzuführen?

Ich versuchte mit einem history.push (window.location.hash), um das Hash-Fragment und Update-Reaktion Router, aber habe den Fehler "dieser Eintrag ist bereits auf dem Stapel vorhanden". Da es eindeutig nicht oben auf dem Standort-Stack ist, führte dies zu der Annahme, dass der react-router window.location mit seinem internen Standort vergleicht, um herauszufinden, wo er letztendlich ist. Also, wie bin ich damit klargekommen?

Ich habe history.replace() stattdessen verwendet, die nur den Eintrag auf der Oberseite des Stapels mit einem neuen Wert ersetzt, anstatt einen neuen Eintrag auf den Stapel zu schieben.Dies ist auch sinnvoll, da wir nicht möchten, dass Benutzer, die "zurück" in ihren Browsern navigieren, zu diesem /state=blah-blah-blah url < zurückkehren - Ersetzt diesen Eintrag aus dem Verlaufsstapel.

Ein letzter Teil: react-router history.location, wie window.location, hat sowohl Pfadnamen als auch Hash-Komponenten. HashRouter verwendet die Komponente history.location.pathname, um die clientseitige Route nach dem Hash im Browser zu verfolgen. Das Äquivalent dazu in window.location wird in window.location.hash gespeichert. Daher verwenden wir dies als den Wert, der an history.replace() anstelle von window.location.pathname übergeben wird. Das verwirrte mich ein wenig, macht aber Sinn, wenn man darüber nachdenkt.

react-router history verfolgt auch seine aktuelle Route mit einem vorangestellten / statt einer vorangestellten #, da es nur behandelt wie jede normale URL. Bevor ich history.replace() genannt, ich meine window.location.hash zu nehmen brauchte, ersetzen Sie das führende Hash mit einem / und dann dieser Wert history.replace()

const slashPath = window.location.hash.replace('#', '/'); history.replace(slashPath);

Whew passieren!