Sorry, wenn das eine Noob-Frage ist. Was passiert, wenn der API-Aufruf die Sitzung des Benutzers benötigt. Ich gehe davon aus, dass diese Sitzungscookies nicht an den API-Endpunkt weitergeleitet werden, wenn das Rendering serverseitig erfolgt?
Irgendeine Idee, wie ich die Cookies des Benutzers an den API-Endpunkt weiterleiten soll. Ich denke, es wird irgendwo in HttpClient.js sein?
Vielen Dank
@asadm es sollte die Cookies automatisch senden (wenn Sie eine Cross-Anfrage machen, stellen Sie sicher, dass Sie .withCredentials()
hinzufügen), aber das Problem, das ich damit habe, ist, dass es auf der Serverseite nicht funktioniert . Ich bekomme immer Error: Failed to serialize user into session
wenn der Server eine Login-Anfrage sendet. Im Browser oder mit curl
funktioniert die Login-Anfrage jedoch einwandfrei.
Senden Sie gerne eine PR mit Axios oder Fetch etc.
@jaredpalmer Ich habe noch nicht herausgefunden, wie ich das Problem lösen kann, aber ich kann versuchen, an einer PR zu arbeiten, sobald sie behoben ist. :sweat_smile:
Ich erhalte übrigens den gleichen Fehler mit fetch
.
@jaredpalmer Leider überhaupt nicht. Dies hat mit universellem Rendering zu tun, Passport funktioniert einwandfrei. Es funktioniert auch gut, Anfragen vom Browser oder curl
zu senden, nur wenn der Server in diesem Boilerplate die Anfrage zum Abrufen von initialState
, schlägt dies fehl. Ich gehe davon aus, dass dies daran liegt, dass die Serverseite die Benutzersitzung nicht speichert. Gibt es eine Möglichkeit, dies zu tun?
Ich denke, der einfachste Weg, dieses Problem zu umgehen, besteht darin, ein Token zurückzugeben und dieses im Status zu speichern und dann Anforderungen später mit dem Token zu authentifizieren. Wäre schön, wenn Client/Server die richtige Benutzersitzung automatisch teilen würde :smile:
Dies könnte ein verwandtes Problem sein: http://stackoverflow.com/a/12735003/702288
Kannst du auf ein Beispiel-Repository verlinken? Benutzt du auch Express-Session?
@jaredpalmer Leider kann ich den Code nicht teilen, aber es ist nicht schwer, passport
zu Ihrem vorhandenen Textbaustein hinzuzufügen: http://passportjs.org/docs
Ja, ich verwende express-session
. Ich habe versucht, superagent.agent()
, aber es hat das Problem nicht gelöst.
@jaredpalmer Ich habe gerade eine neue Instanz Ihres Boilerplates geklont und express-session
hinzugefügt. Die Einstellung von req.session
Absturz (ich habe es in src/server/api/posts.js
getan). Sie können dies in meinem Fork omnidan/react-production-starter ( relevanter Commit ) überprüfen.
Ok, egal, mein Problem scheint nichts damit zu tun zu haben :blush:
Ich habe gerade herausgefunden, dass der Benutzer nicht serialisiert werden konnte, da die Daten über json
vom Server gesendet wurden, aber urlencoded
vom Browser/Curl. Das Hinzufügen von app.use(bodyParser.json())
zu meinem Server hat das Problem für mich behoben.
Ich habe immer noch das Problem, dass die Sitzung nicht richtig zu funktionieren scheint. Ich habe eine Anfrage geändert in (zu Testzwecken):
callAPI: () => http.post('http://localhost:3003/login', {
email: '[email protected]',
password: 'test'
}).then(data => {
console.log('login', data)
return http.get('http://localhost:3003/user')
.then(data => console.log('user data:', data))
}),
Die Ausgabe davon ist:
login { email: '[email protected]' }
user data: { error: 'Not authenticated, please log in.' }
Wenn ich die /login
Anfrage ausführe und dann im Browser auf /user
zugreife, funktioniert es einwandfrei. Scheint, als ob der Server Sitzungen nicht richtig mit dem Client teilt.
Ich habe es irgendwie so gelöst:
Wenn der Benutzer die Seite vom Express-Server anfordert. Das req
enthält alle Sitzungscookies in seinem Header. Ich leite einfach req.headers.cookie
bis HttpClient.js weiter:
get: (cookies, path) => new Promise((resolve, reject) => {
request
.get(getUrl(path))
.accept('application/json')
.set("Cookie",cookies)
.end((err, res) => {
if (err) {
if (err.status === 404) {
resolve(null);
} else {
reject(err);
}
} else {
resolve(res.body);
}
});
}),
Macht das Sinn?
@asadm gute Idee! Ich wollte das lösen, indem ich ein Login-Token im Redux Store speichere, aber das ist so ziemlich das gleiche Konzept mit Cookies. Das probiere ich gleich mal aus :grin:
@omnidan Ich habe diesen Ansatz verfolgt und er ist dem von @asadm bereitgestellten ziemlich ähnlich.
getWithToken: (path, token) => new Promise((resolve, reject) => {
request
.get(getUrl(path))
.set('X-User-Token', token)
.accept('application/json')
.end((err, res) => {
if (err) {
reject(err);
} else {
resolve(res.body);
}
});
})
Hilfreichster Kommentar
@omnidan Ich habe diesen Ansatz verfolgt und er ist dem von @asadm bereitgestellten ziemlich ähnlich.