Node Express, устанавливающие файлы cookie

Я могу здесь неправильно понять.

У меня есть сервер узла, работающий на localhost:3000, и приложение React, работающее на localhost:8080.

Приложение React отправляет запрос get на сервер узла - мой код сервера для этого выглядит так:

const cookieParser = require('cookie-parser');
const crypto = require('crypto');
const express = require('express');

const app = express();

app.use(cookieParser());

app.get('/', function (req, res) {
    let user_token = req.cookies['house_user']; // always empty

    if (user_token) {
        // if the token exists, great!
    } else {
        crypto.randomBytes(24, function(err, buffer) {
            let token = buffer.toString('hex');
            res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
            res.cookie('house_user', token, {maxAge: 9000000000, httpOnly: true, secure: false });
            res.send(token);
        });
    }
});

app.listen(3000, () => console.info('Example app listening on port 3000!'))

Я пытаюсь установить токен house_user, чтобы потом отслеживать запросы от пользователей.

Однако токен не устанавливается для пользователя (запрос от localhost:8080) - токен house_user всегда пуст (на самом деле req.cookies полностью пуст). Мне нужно что-то еще делать?

res.cookie...() - это все, что вам нужно, поэтому удалите res.append(). secure:true позволит cookie работать только с https. Запрос выполняется на https?
jfriend00 18.03.2018 01:24

@ jfriend00 Вы правы - мне плохо; слишком много просеивая сообщения в стеке и пробуя несколько решений: ')

Connor Cartwright 18.03.2018 01:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
7 710
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я просто попробовал приведенный ниже код (и он сработал). Напоминаем, что вы можете просто вставить это в myNodeTest.js, затем запустить node myNodeTest.js и посетить http: // локальный: 3003. Если это работает, то, вероятно, у вас проблемы с CORS.

[РЕДАКТИРОВАТЬ] withCredentials: true должно работать с аксиомами.

axios.get('localhost:3000', {withCredentials: true}).then(function (res) { console.info(res) })
const express = require('express')
const cookieParser = require('cookie-parser')
const crypto = require('crypto');

const port = 3003

app.use(cookieParser());

app.get('/', function (req, res) {
    let user_token = req.cookies['house_user']; // always empty

    if (user_token) {
        // if the token exists, great!
    } else {
        crypto.randomBytes(24, function(err, buffer) {
            let token = buffer.toString('hex');
            res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
            res.cookie('house_user', token, {maxAge: 9000000000, httpOnly: true, secure: true });
            res.append('Set-Cookie', 'house_user=' + token + ';');
            res.send(token);
        });
    }
});

app.get('/', (request, response) => {
  response.send('Hello from Express!')
})

app.listen(port, (err) => {
  if (err) {
    return console.info('something bad happened', err)
  }

  console.info(`server is listening on ${port}`)
})

Привет :) - Мне потребовался парсер файлов cookie (обновил мой пост, чтобы показать сейчас) - к сожалению, я все еще не получаю файлы cookie от req.cookies в последующих запросах.

Connor Cartwright 18.03.2018 01:31

Вы пробовали код, который я опубликовал, просто с помощью простого node myNodeTest.js и посетили localhost: 3003? Я получил твое печенье;)

aquiseb 18.03.2018 01:33

Здесь я думаю, что могу неправильно понять - моя цель - установить файл cookie на клиенте (то есть мое приложение React, работающее на localhost: 8080), которое отправляет запрос на получение на сервер Node. Я не уверен, возможно ли это.

Connor Cartwright 18.03.2018 01:38

Конечно, я знаю, но если это сработает, как я уже упоминал, мы сделаем еще один шаг вперед, зная, что это, вероятно, связано с CORS. Вы используете SSR, например Next.js?

aquiseb 18.03.2018 01:39

Я так не думаю - я использую React с Axiom, чтобы сделать запрос вроде: axios.get ('localhost: 3000 '). then (функция (res) {console.info (res)})

Connor Cartwright 18.03.2018 01:41

Я буду редактировать поэтапно, основываясь на ваших комментариях. Проблема действительно исходит от Axios, в этом уверены на 99%.

aquiseb 18.03.2018 01:49

Asten - добавление withCredentials: true сработало! Большое вам спасибо: D

Connor Cartwright 18.03.2018 02:19

@ConnorCartwright, пожалуйста, после того, как вы рассказали мне об Axios, я был уверен, что проблема в этом;) Ура

aquiseb 18.03.2018 02:27

Превращаю свой комментарий в ответ, поскольку он, похоже, решил вашу проблему.

Поскольку вы работаете на http, а не на https, вам необходимо удалить secure: true из файла cookie, так как это приведет к тому, что cookie будет отправляться только через соединение https, что не позволит браузеру отправить его вам обратно через ваше соединение http.

Также удалите res.append(...), так как res.cookie() - это все, что нужно.

Повторите комментарии к ответу Астена, проблема все еще сохраняется, но, возможно, я просто пытаюсь сделать что-то, что невозможно.

Connor Cartwright 18.03.2018 01:39

@ConnorCartwright - Ваш запрос axios должен быть: axios.get('http://localhost:3000').then(...).catch(...) с протоколом в URL.

jfriend00 18.03.2018 03:59

Другие вопросы по теме