Razzle: Weiterleiten von Client-Cookies an API beim Aufrufen vom Server

Erstellt am 5. Apr. 2016  ·  16Kommentare  ·  Quelle: jaredpalmer/razzle

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

Hilfreichster Kommentar

@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);
        }
      });
  })

Alle 16 Kommentare

@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);
        }
      });
  })
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

dizzyn picture dizzyn  ·  3Kommentare

GouthamKD picture GouthamKD  ·  3Kommentare

gabimor picture gabimor  ·  3Kommentare

JacopKane picture JacopKane  ·  3Kommentare

ewolfe picture ewolfe  ·  4Kommentare