2016-06-12 2 views
1

Ich habe eine App, die Knoten im Backend verwendet und am Frontend reagiert (mit einem Hash-Verlauf).Umleiten zu einem URL-Fragment setzt Sitzung auf Chrome (Node/React/React-Router) zurück

Das bedeutet, meine api Endpunkt-URLs wie folgt aussehen:
https://example.com/api/login

und meine reagieren Endpunkte alle Fragmente aus der Wurzel sind:
https://example.com/#/somePage

Nach dem Benutzer in (durch OAuth2) Anmeldung Ich möchte Leite den Benutzer zu einem bestimmten URL-Fragment innerhalb des React SPA um.

Mein erster Gedanke dafür war, den Server nur umleiten zu dem URL-Fragment.

Mein Weg Handler sieht ungefähr so ​​aus:

app.get('/oauthCallback', (req, res) => { 
    req.session.token = 'some token' 
    redirect('/#/someLoggedInPage') 
} 

In Safari das funktioniert gut und jeder weitere API-Anfragen aus dem SPA gemacht haben die gleiche req.session teilen und damit das Token und kann authentifiziert Downstream-Anforderungen machen .

In Chrome verursacht die nächste API-Anforderung jedoch bei der Umleitung die Erstellung einer neuen Sitzung, wodurch das Token verloren geht und authentifizierte Anforderungen nicht erfolgreich ausgeführt werden können.

Alles funktioniert gut, wenn zu einem anderen API-Endpunkt umgeleitet wird (nicht im SPA).

Es funktioniert auch nicht, wenn ich an /, die Wurzel des SPA umleiten.

Ich frage mich, ob es etwas gibt, weiß ich nicht, wie Chrome URL-Fragmente und Sitzungen behandelt.

Antwort

0

Also nach 3 Tagen des Elends habe ich das ausgearbeitet.

Es stellt sich heraus, dass nicht Chrome ein falsches Verhalten aufweist, sondern Safari.

Die library, die ich für die Erstellung von XHR-Anfragen verwende, sendet keine Cookies an den Server mit der Client-Anfrage, es sei denn, Sie haben die Option: credentials: 'same-origin.

Zum Beispiel:

fetch(endpoint, { method, headers, credentials: 'same-origin' }) 
    .then(res => { 
     // do something 
    }); 

Sieht aus wie Safari sie trotzdem sendet, das ist, was die Verwirrung verursacht. Hoffentlich wird das jemandem helfen.

+0

Dies erklärt auch, warum es für API-Anfragen, aber nicht für Anfragen aus dem SPA funktionierte, da die SPA-Anfragen die einzigen waren, die 'fetch' verwenden und daher diese Option benötigen –

Verwandte Themen