Cook ie в заголовке Set-Cook ie не устанавливается - PullRequest
4 голосов
/ 02 мая 2020

Я отправляю запрос на сервер node.js от клиента reactjs, используя ax ios, как показано ниже.

import axios from 'axios';

const apiClient = axios.create({
  withCredentials: true,
  baseURL: 'http://localhost:8080'
});

async function(payload) {
  try {
    debugger;
    let result = await apiClient.post('/auth/signup/', payload);
    debugger;
    return result;
  } catch (error) {
    debugger;
    throw error;
  }
}

Конечная точка node.js устанавливает повара ie в ответе, как показано ниже.

const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser')
const cors = require('cors');
const jwt = require('jsonwebtoken');

router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: true }));
router.use(cors({ origin: 'http://localhost:3000', credentials: true, exposedHeaders: ['Set-Cookie', 'Date', 'ETag']} ));
router.use(cookieParser());


router.post('/signup', async (req, res, next) => {
  debugger;
  let database = req.app.locals.database;
  try {
    let user = await database.findByUsername(req.body.username);
    let token = await jwt.sign({username: user.username}, config.secret, {expiresIn: "15m"});
    res.cookie('jwt',  token, {
      maxAge: 900,
    });
  } catch (error) {
    debugger;
    return res.status(503).send({ auth: false, message: 'Database error.' });
  }
});

Заголовок ответа Set-Cook ie содержит повара ie как и ожидалось.

Set-Cookie Header

Однако Chrome, похоже, не настраивает повара ie, так как я не вижу повара ie в окне приложения консоли разработчика.

Cookies

Я посмотрел ответы на следующие вопросы, в которых упоминается настройка { withCredentials: true } в конфигурации топора ios и без использования подстановочного знака для cors в node.js, но я уже делаю и то, и другое.

Set-Cook ie заголовок не настраивает cook ie в Chrome

Установить файлы cookie для запросов перекрестного происхождения

Есть идеи относительно того, почему не установлен параметр cook ie и как это исправить вопрос

1 Ответ

1 голос
/ 02 мая 2020

Несмотря на то, что вы размещаете клиент и сервер в том же домене, что и http://localhost, ваши порты отличаются, поэтому здесь политика одного источника не удалась. Вы можете проверить https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy.

Таким образом, когда вы делаете запрос CORS, откройте вкладку сети в инструментах разработчика в текущем браузере, вы можете увидеть предварительный запрос OPTIONS до того, как ваш клиент отправит POST запрос на ваш сервер.

Сервер должен указать заголовки, чтобы принять источник вашего следующего запроса - запрос POST от http://localhost:8000 с методом POST, вы можете обратиться к https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request

HTTP/1.1 204 No Content
Connection: keep-alive
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: POST // Your next request will use POST method
Access-Control-Max-Age: 86400
Access-Control-Allow-Credentials: true // cookies accepted

Добавлено:

В Set-Cookie, Max-Age должно быть ненулевое ди git. Оно должно быть округлено до целого числа в соответствии с RF C do c. Для express. js свойство maxAge для файлов cookie находится в масштабе милисекунд

Для решения будет установлено свойство maxAge как second * 1000

    res.cookie('jwt',  token, {
      maxAge: 10000,
    });
...