res.cookie не устанавливает cookie в браузере - PullRequest
0 голосов
/ 15 декабря 2018

В настоящее время я пытаюсь настроить приложение Node / Express с клиентом React для взаимодействия с ним.Я установил паспорт для обработки аутентификации с помощью JWT.Когда пользователь входит в систему, я проверяю адрес электронной почты / пароль.Затем я устанавливаю cookie:

res.cookie('jwt', token, { httpOnly: true, secure: false });

Я вижу, что токен передается обратно в заголовок ответа, но когда я проверяю cookie моего браузера Chrome в меню «Инструменты разработчика»> «Приложения»> «Файлы cookie», я вижу пустой файл cookie.Что я делаю не так и как мне отправить jwt в заголовок ответа с последующими запросами?

server / App.js

const app = express()

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

app.use(cookieParser());

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.post('/login', (req, res) => {
  passport.authenticate('local', { session: false }, (error, user) => {
    if (error || !user) {
      res.status(400).json({ error });
    }

    // Construct JWT payload
    const payload = {
      email: user.email,
      expires: Date.now() + parseInt(process.env.JWT_EXPIRATION_MS),
    };

    // Assign payload to req.user
    req.login(payload, {session: false}, (error) => {
      if (error) {
        res.status(400).send({ error });
      }
      // Generate a signed JWT
      const token = jwt.sign(JSON.stringify(payload), process.env.JWT_SECRET);

      // Assign JWT to cookie
      res.cookie('jwt', token, { httpOnly: true, secure: false });
      res.status(200).send({ email: user.email });
    });
  })(req, res);
});

client/LoginModal.js

  handleLogin = async () => {
    const { name, email, password } = this.state

    try{
      const res = await axios.post('http://localhost:8080/login', {
        email: email,
        password: password,
      })

      if(res.status == 200){
        console.log("Logged in")
        console.log(res)
      }

    } catch (err) {
      console.log(err)
    }
  }

Редактировать: Мой обходной путь - отправить токен как часть полезной нагрузки.Затем мой реагирующий клиент получает токен из полезной нагрузки и сохраняет его в файле cookie браузера.Есть ли способ избежать этого обходного пути (см., Например, ниже)?

сервер

 res.status(200).send({ email: user.email, jwt: token });

клиент

  if(res.status == 200){
    cookies.set('jwt', res.data.jwt)
    cookies.set('email', res.data.email)
  }

1 Ответ

0 голосов
/ 27 июля 2019

У вас настроен файл cookie с включенным флагом httpOnly.Большинство современных браузеров ограничивают доступ для чтения к таким файлам cookie с помощью инструментов разработчика.Подробнее об этом можно прочитать здесь .

Если вы хотите просмотреть содержимое файла cookie в вашей среде разработки, установите для httpOnly значение false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...